Lambda Expression的工作原理

时间:2012-01-15 14:07:17

标签: c# linq lambda

在一次采访中,面试官问我以下查询

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();

作品?

5 个答案:

答案 0 :(得分:7)

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

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

e => ...

构造一个带有一个参数的函数。

e <= func(2)

efunc(2)进行比较。 func(2)使用参数func调用函数2

总而言之,<==>无关。他们是两个完全不同的运营商。总结... => ...构造一个函数。 ... <= ...比较了这些论点。

答案 1 :(得分:4)

Func<int, int>表示func是一个函数,其中一个参数类型为int,结果类型为int。 i是参数。该函数将数组元素写入控制台并返回未修改的参数。

Where函数返回与给定谓词匹配的所有情况,ToArrayWhere返回的IEnumerable中生成一个数组(读取linq)。 e => e <= func(2)是一个函数,其中一个参数的类型为int(与集合类型相同),结果类型为bool。您可以将其编写为普通函数:

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

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

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

但不注意副作用。

答案 2 :(得分:4)

如果你看一下C#中=<>的可能组合:

  • <=是“小于或等于”运算符
  • >=是“大于或等于”运算符
  • =>是lambda运算符,左边是lambda的参数,右边是body
  • =<无效,没有此类运营商

答案 3 :(得分:2)

对于所有e,其中e小于或等于func(2)。 ToArray()调用会导致对LINQ表达式的评估,因此3333333333将打印在控制台上

答案 4 :(得分:1)

Where()LINQ query,它根据lambda表达式参数中包含的测试过滤数组。

e => e <= func(2)是一个lambda表达式,传递给Where()查询以获取array中的每个元素,如果该值小于result,则将该元素添加到ToArray()或等于(“&lt; = ”)func(2)。

{{1}}是一个转换运算符,其作用类似于从IEnumerable到数组的转换。

有关LINQ的更多信息,请参阅here