Linq如何在select中传递参数

时间:2014-09-05 12:31:12

标签: 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) 
{ 
    Console.WriteLine("{0}: {1}", n.Num, n.InPlace); 
} 

我不理解以下行的执行情况:

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

根据我的理解numindex是参数,但我不明白我们在哪里决定第一个参数是数字,第二个参数是数字索引?< / p>

是否为int类型的数组修复了什么?

有人可以帮我理解这个吗? 提前谢谢。

3 个答案:

答案 0 :(得分:3)

方法Select的定义决定了它。 选择有至少2个定义,其中一个表示它需要Func<MyInput,int,MyReturn>。我们知道除Func的最后generic parameter之外的所有都是输入,最后一个是输出。 Func是一种特殊类型的对象(委托类型),它有一个名为Invoke()的方法来运行它,还有一个特殊的语法 - 糖 - 简写(),它表示你可以省略Invoke而只是写()

Func<object, int> d = x => 1 
d.Invoke(null) // will always return 1
d(new Object()) // also the same

enter image description here

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

答案 1 :(得分:-1)

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

Func<T, Index, TResult> Delegate

译成英文的Func是:“一个在数组中取T和T的索引的方法,并返回一个TResult。

还有一个名为Action delegate的东西,它没有返回。

请参考此链接: http://simpleprogrammer.com/2010/09/24/explaining-what-action-and-func-are/

答案 2 :(得分:-1)

请参阅此link

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