【问题标题】:Location of XElement when querying over IEnumerable using LINQ使用 LINQ 查询 IEnumerable 时 XElement 的位置
【发布时间】:2010-02-21 01:10:43
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-09
        相关资源
        最近更新 更多