LINQ - (x, i) 是什么意思?

4

我今天偶然发现了这段代码,但是我完全不理解它。

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

(x, i) 的作用是什么?我看到了对i的引用,但不明白x如何适配该lambda表达式。

还有,为什么i是整数?我注意到末尾有i+1,因此我认为这是正确的。

感谢您的帮助。


这是Lambda函数的定义。 - Sam Axe
3
而且你确实看到了它... i + 1... 好吧,我看到了。 - Sam Axe
@SamAxe 我应该明确说明我是指 x 而不是 i - Kellen Stuart
这取决于代码的目的。看起来它正在构建一个与原始数组相同长度的XML元素列表。当人们需要一个与原始列表相同长度的新列表时,我见过人们做这样的事情,尽管你也可以使用 Enumerable.Range(0, someArray.Length).Select(i => ...)。这取决于上下文 - 你接下来要用XML元素列表做什么?你能问一下最初编写它的人吗? - Rup
4
该代码只需要 i。唯一提供 i 参数的 Select 重载方法(参见链接 https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.select?view=netframework-4.8#System_Linq_Enumerable_Select__2_System_Collections_Generic_IEnumerable___0__System_Func___0_System_Int32___1__)同时也提供了参数 x。因此,即使代码没有使用 x,也必须声明 x 参数。 - GSerg
3个回答

4
它之所以存在,是因为表达式需要使用该元素的索引,这是lambda表达式的第二个参数i。另外一个Select重载函数接受一个参数的Function对象,只能访问元素(在那个示例中lambda参数名为x)。
这里提供了Select方法文档的链接

4

x是值,i是索引。

例如,以下代码片段:

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)

Microsoft的文档在这里


0

您正在查看LINQ .Select()方法的此特定重载。如上所述,i只是相应序列中x的(以零为基础*)索引。

回到您的特定代码片段,它完全忽略了x并使用i生成一个(以一为基础)值,最终转换为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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接