【问题标题】:Why does this anonymous type Linq expression work? [closed]为什么这个匿名类型的 Linq 表达式有效? [关闭]
【发布时间】:2014-08-16 17:47:54
【问题描述】:

我正在寻找一个代码 sn-p,它返回给定浮点数组的前 N ​​个元素的索引。我找到了以下代码并且它可以工作,但我不知道为什么:

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

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

【问题讨论】:

  • 你在问为什么 Select 传递值和索引?因为这就是写它的人打算做的。它有一个重载,只将值传递给选择器,另一个重载传递值和索引。请参阅docs

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


【解决方案1】:

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

documented

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

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

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

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

public ResultType MyMethod(MyType value, int index)
{

}

如果你是第一次看到这种语法,你一定要看看文档:

【讨论】:

  • 这解释了很多。谢谢!
【解决方案2】:

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

选择器

类型:System.Func
应用于每个源元素的变换函数;函数的第二个参数表示源元素的索引。

【讨论】:

  • 我还是不明白,因为如果我这样写:floatArray.Select((x, y) => new {x, y}) 它仍然有效。那么程序怎么会知道我说的属性是元素的值和它的索引呢?
  • @AhmedAshour 哦,嘿,这根本不是我从你的问题中得到的。让我编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
相关资源
最近更新 更多