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();
作品?
答案 0 :(得分:7)
如果使用括号,可能更容易理解:
var result = array.Where(e => (e <= func(2))).ToArray();
此
e => ...
构造一个带有一个参数的函数。
此
e <= func(2)
将e
与func(2)
进行比较。 func(2)
使用参数func
调用函数2
。
总而言之,<=
与=>
无关。他们是两个完全不同的运营商。总结... => ...
构造一个函数。 ... <= ...
比较了这些论点。
答案 1 :(得分: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;
}
但不注意副作用。
答案 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。