被C#lambda表达式弄糊涂了

被C#lambda表达式弄糊涂了,c#,lambda,C#,Lambda,我一直在学习lambda表达式,当我终于能够阅读/理解=>运算符时,我很高兴,它对我来说有点像“where”的意思 List a=newlist(){0,1,2,1,3,4,5,6,7,8,9}; IEnumerable b=a.FindAll(x=>x>=5); foreach(b中的int x) 控制台写入线(x); 阅读上面这一行,我个人有理由将其理解为“从该列表中查找所有x,其中x大于或等于5”,非常好。 但是,我在Select方法中遇到了lambda表达式的不同用法 List<

我一直在学习lambda表达式,当我终于能够阅读/理解=>运算符时,我很高兴,它对我来说有点像“where”的意思

List a=newlist(){0,1,2,1,3,4,5,6,7,8,9};
IEnumerable b=a.FindAll(x=>x>=5);
foreach(b中的int x)
控制台写入线(x);
阅读上面这一行,我个人有理由将其理解为“从该列表中查找所有x,其中x大于或等于5”,非常好。 但是,我在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);
List a=newlist(){0,1,2,1,3,4,5,6,7,8,9};
IEnumerable b1=a.Select(x=>x*2);
foreach(b中的int x)
控制台写入线(x);
对于这一个,前面读取这个操作符的方法没有意义,因为对我来说,这个代码是“For each x return x*2”,这与前面同一个操作符的“函数”非常不同。
我知道.FindAll和.Select之间的区别在于处理输入和输出参数的不同方式,但我所说的是在lambda表达式中使用运算符=>。在这两种情况下,
=>
运算符的含义完全相同:它创建一个函数,其参数就是左边的东西,其返回值是右边的东西

您在评论中写道,第一种情况下的
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);
…然后将该函数用作
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);
…并将函数作为参数传递给
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);
List a=newlist(){0,1,2,1,3,4,5,6,7,8,9};
IEnumerable b1=a.Select(MyOperation);
foreach(b中的int x)
控制台写入线(x);

这个问题没有问题,所以让我们编一个

当lambda返回bool并用作测试值的谓词时,将lambda运算符特征化为“where”起作用。lambda算子是否有一个更一般的特征在其他情况下有意义,比如投影

对。将lambda运算符读为“转到”

“每个x到x乘以2”

您也可以将其用于谓词:

a.Where(x => x > 2);
“每个x都指向‘x大于2吗?’

但这很尴尬。正如您所注意到的,更容易将其视为“where”或“so that”

“每个x的x大于2”

同样地

a.OrderBy(x => x.LastName)
“按x的顺序每个x都是姓氏”很尴尬。只需说“按姓氏订购每个x”

简而言之:操作员的英语解释取决于上下文。运算符的形式解释总是一样的:它只是描述一个函数。

这样想:

  • 数学:f(x)=x+x

    这是一个数学函数f,它取一个数字x,然后吐出它的双精度

  • Lambda:
    f=x=>x+x
    C#定义相同函数f的方法

另一个例子:

  • 数学:g(x,y)=x>y

    g是一个函数,它接受两个数字x和y,并返回前者是否大于后者

  • Lambda:
    g=(x,y)=>x>y
    C#定义相同函数g的方法

现在清楚了吗


p.D:我没有提到类型推断和lambda的类型本身;考虑到这个问题的上下文,这是一个不必要的干扰。

这个
=>
声明了一个函数。左边是它的参数,右边是函数的主体。请注意,return语句是隐式的。函数的使用方式严格取决于您赋予它的方法。在
中选择
它将向您传递每个元素,然后您从中返回所需内容。在
FindAll
中,您可以告诉它您是否需要该元素。我认为您将从更多关于LINQ/Lambda的研究/教程中受益匪浅。
=>
运算符,它对我来说意味着“where”是您的第一个错误。它不是where语句,而是作为迭代器返回结果的委托。如前所述,你的问题是什么?@Liam这里的结果不是迭代器,也不是一般意义上的迭代器。第一个返回布尔值,第二个返回整数。试着把你的问题表述成一个问题,这样它就可以被回答。让你困惑的事情清单是一个很好的问题介绍,但它不是一个问题。再次回到这里说谢谢,现在它对我来说很有意义
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);
a.Select(x => x * 2);
a.Where(x => x > 2);
a.OrderBy(x => x.LastName)