使用LINQ查询IEnumerable时XElement的位置

时间:2010-02-21 01:10:43

标签: c# linq linq-to-xml ienumerable

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

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

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

关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:2)

您需要使用允许索引的overloaded Select method,因为该功能在查询语法中不可用。

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

答案 1 :(得分:0)

如果您使用的是.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类(这就是我所做的)存储组合值,或者你可以使用匿名类型。