【问题标题】:LINQ - What does (x, i) do?LINQ - (x, i) 做什么?
【发布时间】:2019-12-10 00:14:38
【问题描述】:

我今天偶然发现了这段代码,并意识到我从来没有理解过它。

someArray.Select((x, i) => new XElement("entry",
                            new XElement("field", new XAttribute("name", "Option"), i + 1)

(x, i) 的意义何在?我看到了对 i 的引用,但我不明白 x 如何适合这个 lamda 表达式。

另外,为什么i 是一个整数?我看到最后有一个i + 1,所以我假设这是真的。

感谢您的帮助

【问题讨论】:

  • 这就是lambda函数的定义。
  • 你确实看到了...i + 1.. 好吧,我看到了。
  • @SamAxe 我应该指定我的意思是x 而不是i
  • 这取决于代码试图做什么。看起来它正在构建一个与原始数组长度相同的 XML 元素列表。我看到人们在需要一个与原始列表长度相同的新列表时会做这种事情,尽管您同样可以使用Enumerable.Range(0, someArray.Length).Select(i => ...)。这取决于上下文 - 然后您如何处理 XML 元素列表?你能问一下是谁写的吗?
  • 代码只需要i。唯一的overload of Select that provides the i 也提供x。所以代码也必须声明x,即使它没有使用它。

标签: c# xml linq lambda anonymous-function


【解决方案1】:

x 是值,i 是索引。

例如,sn-p:

void Main()
{
    var values = new List<int> {100, 200, 300};
    foreach( var v in values.Select((x, i) => (x, i))) // x is the value, i is the index
        Console.WriteLine(v);
}

打印出来:

(100, 0) (200, 1) (300, 2)

微软documentation is here

【讨论】:

    【解决方案2】:

    因为表达式想要使用元素的索引,它是 lambda 表达式的第二个参数,iSelect 的另一个重载,Function 对象传递的重载只接受一个参数,只访问元素(在该示例中名为 x 的 lambda 参数)。

    这是a linkSelect 方法文档。

    【讨论】:

      【解决方案3】:

      您正在查看LINQ .Select() 方法的这种特殊重载。如上所述,i 只是序列中各个x 的(从零开始的*)索引。

      回到您的特定代码 sn-p,它完全无视 x 并使用 i 生成一个(one-based)值,最终转换为 XML 节点。所以,如果你有你的

      var someArray = Enumerable.Range(9999,5); // I'm just generating some big numbers here, you can do the same with strings or objects - it doesn't matter.
      

      运行代码你会得到这样的结果:

      <entry>
        <field name="Option">1</field>
      </entry>
      
      <entry>
        <field name="Option">2</field>
      </entry>
      
      <entry>
        <field name="Option">3</field>
      </entry>
      
      <entry>
        <field name="Option">4</field>
      </entry>
      
      <entry>
        <field name="Option">5</field>
      </entry>
      

      【讨论】:

        猜你喜欢
        • 2015-06-17
        • 2014-06-14
        • 2015-08-17
        • 1970-01-01
        • 2021-07-11
        • 2016-05-16
        • 2016-04-10
        • 2021-09-21
        • 2015-01-12
        相关资源
        最近更新 更多