我正在学习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表达式可以采用多少个参数?如何决定在我的代码中写入的参数数量?
答案 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)
简单来说,它意味着返回所有大于(或等于)它们在数组中的位置的数字,直到找到一个不适合的数字。即它只返回前两个(5
和4
)。
编辑:只是添加,如果你想获得所有这些数字(即不是第一次遇到不合适的数字时停止),你可以将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)
这将返回整数,直到第一个整数超过给定列表中的索引。