Linq如何在select中传递参数

Linq如何在select中传递参数,linq,Linq,我正在学习LINQ,我发现了这个例子 int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var numsInPlace = numbers.Select((num, index) => new { Num = num, InPlace = (num == index) }); Console.WriteLine("Number: In-place?"); foreach (var n in numsInPlace) {

我正在学习LINQ,我发现了这个例子

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 

var numsInPlace = numbers.Select((num, index) => new { Num = num, InPlace = (num == index) }); 

Console.WriteLine("Number: In-place?"); 
foreach (var n in numsInPlace) 
{ 
    Console.WriteLine("{0}: {1}", n.Num, n.InPlace); 
} 
我不理解以下行的执行:

var numsInPlace = numbers.Select((num, index) => new { Num = num, InPlace = (num == index) }); 
根据我的理解,
num
index
是参数,但我不明白我们在哪里决定第一个参数是数字,第二个参数是数字的索引

对于int类型的数组,它是固定的吗

有谁能帮我理解这一点吗?
提前感谢。

方法选择的定义决定了它。 Select至少有两个定义,其中一个表示它需要
Func
。我们知道,除了Func的最后一个
泛型参数
外,其他所有参数都是输入,最后一个是输出。 Func是一种特殊类型的对象(委托类型),它有一个名为Invoke()的方法来运行它,还有一个特殊的语法sugar-shorthand
()
,表示可以省略
Invoke
,只需编写
()

Func d=x=>1
d、 Invoke(null)//将始终返回1
d(new Object())//也一样

所以编译器接受你们的函数,并试图找到一个可以接受这种函数的选项。然后进行编译。然后在运行时,Select只从集合中获取第一个、第二个等元素,并通过传递该元素(如果选择了Select重载和接受索引的函数,则传递索引)来运行您的函数。

(num,index,TResult)=>new{…}是Func delegate类型的匿名函数。 它是由.Net Framework定义的。因此,第一个参数是对象,其中第二个参数是数组中对象的索引

Func<T, Index, TResult> Delegate
Func委托
Func翻译成英语是:“一种方法,它在数组中获取T和T的索引,并返回一个TResult

还有一种称为Action delegate的东西,它没有返回

请参考此链接:

看看这个


selector的第一个参数表示要处理的元素。selector的第二个参数表示源序列中该元素的从零开始的索引。例如,如果元素的顺序已知,并且您希望对某个特定索引处的元素执行某些操作,则此参数可能会很有用。如果您希望重新尝试一个或多个元素的索引。

如何像那样展开重载列表可能存在重复?在本例中,我有一个ReSharper。这是一个非常常用的工具。很抱歉,我甚至无法向您展示在没有ReSharper的情况下它在vs中的工作方式。提示:当文本光标位于正确位置时,Ctrl+空格键可以显示弹出窗口和信息。谢谢,我将为您提供帮助我得去看看。
Func<T, Index, TResult> Delegate