为什么这个匿名类型的Linq表达式有效?

时间:2014-08-16 17:47:55

标签: c# .net arrays linq anonymous-types

我正在寻找一个代码片段,它返回给定浮点数组的前N个元素的索引。我找到了以下代码并且它有效,但我不明白为什么:

        int[] indexArray = floatArray
               .Select((value, index) => new { value, index })
               .OrderByDesc(item => item.value)
               .Take(N)
               .Select(item => item.index)
               .ToArray();

程序如何知道匿名类型的第一个属性是float元素的值,第二个属性是它的索引?我的意思是为什么不相反?为什么索引呢?

2 个答案:

答案 0 :(得分:1)

Select扩展方法有各种重载,你正在使用的那个,一个带有两个参数(this one)的函数,调用该函数,第一个参数是值,第二个参数是索引。语言对此一无所知,它只是在库中指定。它同样可以按相反的顺序定义。

  

选择

     

类型:System.Func< TSource,Int32,TResult>
  应用于每个源元素的转换函数;函数的第二个参数表示源元素的索引。

答案 1 :(得分:1)

  

程序如何知道匿名类型的第一个属性是float元素的值,第二个属性是它的索引?

documented

  

选择器类型:System.Func<TSource, Int32, TResult>

     

应用于每个源元素的转换函数; 第二个   函数的参数表示源元素的索引

(value, index) => new { value, index }

是lambda表达式。它需要两个参数,并返回一个结果。第一个参数类型是集合中元素的类型,第二个是整数,它是索引。这里的名字无关紧要,你可以说(x,y) => new { x , y }它是同一个东西,重要的是你的论点的顺序。您可以将此表达式视为此类方法的语法糖:

public ResultType MyMethod(MyType value, int index)
{

}

如果您第一次看到这种语法,那么您一定要查看文档: