Lambda表达式是如何工作的

20

在面试中,面试官问我以下问题:

int[] array = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Func<int, int> func = i =>
{
    Console.Write(array[i]);
    return i;
};

var result = array.Where(e => e <= func(2)).ToArray();

有人能指导我 e <= func(2) 这个东西是怎么工作的吗?还有最后一行即

是什么意思?

var result = array.Where(e => e <= func(2)).ToArray();

有效吗?


1
研究闭包,或者可能是谓词,取决于你的困惑在哪里。 - George Duckett
1
你到底哪里困惑了?你不明白什么? - svick
4
我认为面试官试图用两支箭来欺骗你。 - J. Holmes
我对“<=”符号感到困惑...因为它看起来像我们在Lambda中使用的符号(=>)...这个符号是用在Lambda中吗?还是只是为了制造混淆? - Usman
1
混淆 = 真。与lambda无关,只是一个普通的小于等于。 - J. Holmes
5个回答

7

如果您使用括号可能会更容易理解:

var result = array.Where(e => (e <= func(2))).ToArray();

这是一个HTML标签。
e => ...

构造一个只接受一个参数的函数。
这个函数会接收一个参数。
e <= func(2)

比较efunc(2)func(2)调用带有参数2的函数func
总之,<==>无关。 它们是两个完全不同的运算符。 总结一下,... => ...构建一个函数。... <= ...比较参数。

12
换句话说, => 是“⇒”的一个糟糕的近似,而 <= 是“≤”更糟糕的近似。 - Jon Purdy

4
如果您看一下C#中=<>的可能组合:
  • <=是“小于或等于”运算符
  • >=是“大于或等于”运算符
  • =>是lambda运算符,左边是lambda参数,右边是lambda体
  • =<无效,没有此类运算符

4
Func<int, int> 表示 func 是一个带有一个类型为int的参数和一个类型为int的返回值的函数。其中,i 是指该参数。该函数将数组元素写入控制台并返回未修改的参数。 Where 函数返回与给定谓词匹配的所有情况,ToArray 从由 Where 返回的 IEnumerable 中创建一个数组 (请阅读 Linq 相关资料)。 e => e <= func(2) 是一个带有一个类型为int的参数 (与集合类型相同) 和类型为bool的返回值的函数。您可以将其编写为普通函数。
bool Foo(int e) {
    return e <= func(2);
}

由于 func 返回一个未修改的参数,因此它在功能上等同于

bool Foo(int e) {
    return e <= 2;
}

但不要忽略副作用。


优秀的回答。跟我即将发布的内容类似!:) - gideon
@Dmitry Polyanitsa...你能告诉我在 Func <int, int> 中,哪个参数是返回值?哪个是输入值? - Usman
第一个是输入,第二个是结果:http://msdn.microsoft.com/zh-cn/library/bb549151.aspx - Dmitry Polyanitsa

2
这意味着对于所有满足条件 func(2) 大于等于 e 的值,ToArray() 方法将会评估一次 LINQ 表达式。因此,控制台上将打印出 3333333333

1
会打印出 23?我本来猜想是 3333333333 - J. Holmes
1
func(2) 总是显示数组的第三个元素(3),并且对数组中的每个元素进行评估,因此它显示3333333333。 - nan
对我来说,考虑到参数是2,结果将会是1、2、3。 - Tigran
func(2) 将对数组中的每个元素进行求值。它会输出 arr[2],也就是 3,然后返回 2。 - J. Holmes
+1,但是输出数组将是1、2,只有3333333333会被写入输出。 - Saeed Amiri

1

Where() 是一个基于其 lambda 表达式参数中包含的测试来过滤数组的 LINQ 查询

e => e <= func(2) 是一个传递给 Where() 查询的 lambda 表达式,它会将 array 中的每个元素添加到 result 中,如果该值小于或等于 ("<=") func(2)。

ToArray() 是一个转换运算符,类似于从 IEnumerable 到数组的强制类型转换。

有关 LINQ 的更多信息,请参见 此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接