我正在学习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
是参数,但我不明白我们在哪里决定第一个参数是数字,第二个参数是数字索引?< / p>
是否为int类型的数组修复了什么?
有人可以帮我理解这个吗? 提前谢谢。
答案 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
所以编译器接受你的函数并尝试找到一个可以接受这种函数的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的第二个参数表示源序列中该元素的从零开始的索引。例如,如果元素按已知顺序并且您希望对特定索引处的元素执行某些操作,则此操作非常有用。如果要检索一个或多个元素的索引,它也很有用。