我有一个查询IEnumberable的linq查询。当我的where子句有匹配元素时,我想知道元素在IEnumberable中的位置。
var result = from e in elements
where (string) e.Attribute("class") == "something"
select e.Position();
e.Position()当然不会编译。 e.Position()的值将是元素IEnumberable中所选元素的位置。
关于如何做到这一点的任何想法?
答案 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
类(这就是我所做的)存储组合值,或者你可以使用匿名类型。