我一直在学习lambda表达式,当我终于可以阅读/理解=>时,我很高兴。操作员,它的意思是"其中"给我
List<int> a = new List<int>(){0,1,2,1,3,4,5,6,7,8,9};
IEnumerable<int> b = a.FindAll(x => x>=5);
foreach (int x in b)
Console.WriteLine(x);
阅读以上内容,个人有意义将其读作&#34;从此列表中找到所有x WHERE x大于或等于5&#34;,非常好。 但后来我遇到了使用Select方法对lambda表达式的不同用法。
List<int> a = new List<int>(){0,1,2,1,3,4,5,6,7,8,9};
IEnumerable<int> b1 = a.Select(x => x*2);
foreach (int x in b)
Console.WriteLine(x);
有了这个,之前读取这个操作符的方法没有意义,对我而言,这个代码确实是&#34;对于每个x返回x * 2&#34;,这是非常不同的&#34 ;功能&#34;在前一种情况下,同一个运营商做了什么。 据我所知,区别在.FindAll和.Select之间,处理输入和输出参数的方式不同,但我说的是使用operator =&gt;在lambda表达式中。
答案 0 :(得分:8)
这个问题毫无疑问,所以让我们一起来。
将lambda运算符表示为“where”在lambda返回bool时起作用,并用作谓词来测试值。在其他上下文中是否有一个更为一般的lambda算子特征,例如投影?
是。将lambda运算符读作“转到”。
a.Select(x => x * 2);
“每个x转到x乘以2”
您也可以将它用于谓词:
a.Where(x => x > 2);
“每个x进入'是x大于2?'”
但那很尴尬。如你所知,更容易将其视为“where”或“that that”
“每个x使得x大于2”
类似地
a.OrderBy(x => x.LastName)
“将每个x乘x的顺序转到姓氏”很尴尬。只需说“按姓氏命名每个x”。
简而言之:运算符的英语解释取决于上下文。运算符的形式解释始终是相同的:它只是描述一个函数。
答案 1 :(得分:3)
=>
运算符在两种情况下具有完全相同的含义:它创建一个函数,其参数是左边的东西,其返回值是右边的东西。
您在评论中写道,第一种情况下的x
不是您理解的参数。那不正确;在这两种情况下都是一个参数。
这是你的第一个例子:
List<int> a = new List<int>(){0,1,2,1,3,4,5,6,7,8,9};
IEnumerable<int> b = a.FindAll(x => x>=5);
foreach (int x in b)
Console.WriteLine(x);
如果你想在不使用lambda表示法的情况下编写它,你可以在某处定义一个函数,就像这样......
static bool MyCondition(int x)
{
return x >= 5;
}
...然后使用该函数作为FindAll
的参数:
List<int> a = new List<int>(){0,1,2,1,3,4,5,6,7,8,9};
IEnumerable<int> b = a.FindAll(MyCondition);
foreach (int x in b)
Console.WriteLine(x);
lambda表示法是一种较短的表示法,它允许您在使用它的地方定义函数。
同样,如果你想在不使用lambda表示法的情况下编写第二个例子,你可以在其他地方定义一个函数,就像这样...
static int MyOperation(int x)
{
return x * 2;
}
...并将您的函数作为参数传递给Select
,如下所示:
List<int> a = new List<int>(){0,1,2,1,3,4,5,6,7,8,9};
IEnumerable<int> b1 = a.Select(MyOperation);
foreach (int x in b)
Console.WriteLine(x);
答案 2 :(得分:1)
这样想:
数学: f(x)= x + x
这是一个数学函数 f ,它取一个数字 x 并吐出它的双倍。
Lambda:f = x => x + x
C#定义相同功能 f 的方法。
另一个例子:
数学: g(x,y)= x&gt; ÿ
g 是一个函数,它接受两个数字 x 和 y 并返回前者大于后者。
Lambda:g = (x, y) => x > y
C#定义相同功能 g 的方法。
现在更清楚?
P.P:我没有谈论类型推断和lambda本身的类型;考虑到这个问题的背景,这是一种不必要的分心。