我正在寻找一个代码片段,它返回给定浮点数组的前N个元素的索引。我找到了以下代码并且它有效,但我不明白为什么:
int[] indexArray = floatArray
.Select((value, index) => new { value, index })
.OrderByDesc(item => item.value)
.Take(N)
.Select(item => item.index)
.ToArray();
程序如何知道匿名类型的第一个属性是float元素的值,第二个属性是它的索引?我的意思是为什么不相反?为什么索引呢?
答案 0 :(得分:1)
Select
扩展方法有各种重载,你正在使用的那个,一个带有两个参数(this one)的函数,调用该函数,第一个参数是值,第二个参数是索引。语言对此一无所知,它只是在库中指定。它同样可以按相反的顺序定义。
选择
类型:System.Func< TSource,Int32,TResult>
应用于每个源元素的转换函数;函数的第二个参数表示源元素的索引。
答案 1 :(得分:1)
程序如何知道匿名类型的第一个属性是float元素的值,第二个属性是它的索引?
选择器类型:
System.Func<TSource, Int32, TResult>
应用于每个源元素的转换函数; 第二个 函数的参数表示源元素的索引。
(value, index) => new { value, index }
是lambda表达式。它需要两个参数,并返回一个结果。第一个参数类型是集合中元素的类型,第二个是整数,它是索引。这里的名字无关紧要,你可以说(x,y) => new { x , y }
它是同一个东西,重要的是你的论点的顺序。您可以将此表达式视为此类方法的语法糖:
public ResultType MyMethod(MyType value, int index)
{
}
如果您第一次看到这种语法,那么您一定要查看文档: