使用 LINQ 通过 IEnumerable 查询时 XElement 的位置

发布于 2024-08-22 12:03:49 字数 344 浏览 5 评论 0原文

我有一个通过 IEnumberable 进行查询的 linq 查询。当我的 where 子句有一个匹配元素时,我想知道该元素在 IEnumberable 中的位置。

var result = from e in elements
             where (string) e.Attribute("class") == "something"
             select e.Position();

e.Position() 当然无法编译。 e.Position() 的值将是所选元素在元素 IEnumberable 中的位置。

关于如何做到这一点有什么想法吗?

I have a linq query that is querying over IEnumberable. When I have a matching element for my where clause I would like to know the position of the element in the IEnumberable.

var result = from e in elements
             where (string) e.Attribute("class") == "something"
             select e.Position();

The e.Position() of course does not compile. The value of e.Position() would be the position of the selected element in the elements IEnumberable.

Any ideas on how to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

荒芜了季节 2024-08-29 12:03:49

您需要使用重载的 Select 方法,该方法允许索引该功能在查询语法中不可用。

elements.Select((e, i) => new { Element = e, Index = i })
        .Where(item => (string)item.Element.Attribute("class") == "something")
        .Select(item => item.Index);

You need to use the overloaded Select method that allows for an index since that capability is not available in query syntax.

elements.Select((e, i) => new { Element = e, Index = i })
        .Where(item => (string)item.Element.Attribute("class") == "something")
        .Select(item => item.Index);
妞丶爷亲个 2024-08-29 12:03:49

如果您使用的是 .NET 4.0,那么您可以使用(新的)Zip 方法并使用查询语法编写相同的内容。它创建了一些临时对象,因此效率不高,但有些人可能会发现它更具可读性:

var result = from e in elements.Zip
               (Enumerable.Range(0, elements.Count()), Tuple.Create) 
             where (string)e.Item1.Attribute("class") == "something" 
             select e.Item2; 

它使用生成的数字序列(与集合的长度具有相同的范围)“压缩”输入集合。然后,您可以使用 Tuple 类(这就是我所做的)来存储组合值,也可以使用匿名类型。

If you're using .NET 4.0 then you can use the (new) Zip method and write the same thing using the query syntax as well. It creates some temporary objects, so it isn't as efficient, but some people may find it more readable:

var result = from e in elements.Zip
               (Enumerable.Range(0, elements.Count()), Tuple.Create) 
             where (string)e.Item1.Attribute("class") == "something" 
             select e.Item2; 

It 'zips' the input collection with a generated sequence of numbers (with the same range as is the length of the collection). Then you can store the combined value either using the Tuple class (that's what I did) or you could use anonymous type.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文