在LINQ中,“(n,index)=> n> = index”是什么意思?

时间:2011-06-21 09:40:31

标签: c# linq lambda

我正在学习LINQ,并且在其中一本书中遇到了以下代码:

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstBigNumbers = numbers.TakeWhile((n,index)=>n>=index);

什么是(n,index)

我遇到了() =>,这意味着一个不带参数的lambda表达式。

现在的问题是:lambda表达式可以采用多少个参数?如何决定在我的代码中写入的参数数量?

5 个答案:

答案 0 :(得分:5)

(n, index)是lambda表达式的参数。在这种情况下,它们表示集合中的项目及其索引。这可以从TakeWhile方法的签名中推断出来:

public static IEnumerable<TSource> TakeWhile<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, int, bool> predicate
)

lambda表达式(n,index) => n >= index表示谓词:TakeWhile将在满足此谓词时继续产生项目。

答案 1 :(得分:2)

简单来说,它意味着返回所有大于(或等于)它们在数组中的位置的数字,直到找到一个不适合的数字。即它只返回前两个(54)。

编辑:只是添加,如果你想获得所有这些数字(即不是第一次遇到不合适的数字时停止),你可以将TakeWhile更改为{{1} }。

e.g。

Where

返回int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var allBigNumbers = numbers.Where((n, index) => n >= index); (记住它是一个从零开始的数组,因此返回5,4,3,9,8,6,7)。我将它重命名为allBigNumbers,这样才有意义!

答案 2 :(得分:1)

  

(N,索引)

是lambda表达式的参数列表(就地函数定义)。

  

n =&gt;索引

将是函数体(表达体是精确的)。在这种情况下,它是错误的,因为它将返回另一个lambda,其参数类型无法推断,并且也不能转换为'bool'。 TakeWhile接受Func<bool>,因此无法编译。

这更有意义:

numbers.TakeWhile((n,index)=> n>=index)

答案 3 :(得分:1)

您目前使用的代码没有多大意义,因为lambda表达式(n,index)=>(n=>index)(为清晰起见而添加了括号)返回另一个lambda表达式,该表达式从n(列表中的值)到(索引)位置名单。如前所述,您可能意味着(n,index) => (n >= index)

答案 4 :(得分:1)

如果查看TakeWhile的文档,您会看到您正在查看的参数是具有以下签名的谓词:

 Func<TSource, int, bool> predicate

Func部分表示您可以提供一个委托,该委托接受类型为TSource的对象和一个整数,该整数是列表中项目的索引,并返回一个bool。这允许您根据索引和某些条件过滤列表中的项目。

看起来您的代码有拼写错误,应该阅读:

TakeWhile((n,index) => n > index)

这将返回整数,直到第一个整数超过给定列表中的索引。