什么是“;(n,index)=>;n>;=索引“;LINQ中的平均值

本文关键字:gt 平均值 索引 LINQ index 什么 | 更新日期: 2023-09-27 17:59:40

我正在学习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表达式可以接受多少个参数?如何决定要在代码中写入的参数的数量?

什么是“;(n,index)=>;n>;=索引“;LINQ中的平均值

(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将继续生成项。

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

编辑:只是补充一下,如果你想得到所有这样的数字(即不要在第一次遇到不合适的数字时停止),你可以将TakeWhile更改为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(记住它是一个基于零的数组,因此返回3)。我把它重命名为allBigNumbers,所以它很有意义!

(n,索引)

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

n=>索引

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

这更有意义:

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

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

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

 Func<TSource, int, bool> predicate

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

看起来你的代码有一个拼写错误,应该是:

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

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