C# Lambda表达式语法

C# Lambda表达式语法,c#,linq,lambda,C#,Linq,Lambda,在使用LINQ时必须使用lambda表达式,还是lambda表达式是可选的 在lambda表达式中,始终使用符号=>。这是什么意思 customers.Where(c => c.City == "London"); 这里使用了c=>,但为什么? 使用c=>有什么意义。请详细讨论,因为我不认识lambda 不,不必使用lambda表达式。例如,您的,其中示例可以写成: private static bool IsLondon(Customer customer) { retur

在使用LINQ时必须使用lambda表达式,还是lambda表达式是可选的

在lambda表达式中,始终使用符号
=>
。这是什么意思

 customers.Where(c => c.City == "London"); 
这里使用了
c=>
,但为什么? 使用
c=>
有什么意义。请详细讨论,因为我不认识lambda

不,不必使用lambda表达式。例如,您的
,其中
示例可以写成:

private static bool IsLondon(Customer customer)
{
    return customer.City == "London";
}

...

var londoners = customers.Where(IsLondon);
当然,这是假设LINQ是对象。对于LINQ到SQL等,您需要构建一个表达式树

至于为什么在lambda表达式中总是使用“=>”,那只是因为操作符是这样写的——就像问为什么“+”用于加法一样

lambda表达式“c=>…”有效地为lambda表达式提供了一个名为
c
..的参数。。。在这种情况下,泛型类型推断提供了
c
的类型。主体提供要执行的操作或一些计算以返回基于
c
的值

对lambda表达式的全面描述超出了本答案的范围。然而,作为一个明显的例子,它们在C#Depth的第9章中有详细介绍。

lambda表达式

c => c.City == "London"
是类似的缩写

bool IsCustomerInLondon(Customer c)
{
  return (c.City == "London");
}
这只是一种非常简洁的编写返回值的简单函数的方法。它被称为“匿名函数”,因为它从未被赋予名称或正式定义(参数类型和返回类型是从上下文推断出来的)


(事实上,这不仅仅是简写;lambda表达式与其他一些称为的构造相关,它们是非常酷和强大的工具。)

lambda和linq是非常独立的。您可以使用其中一个而不使用另一个(linq的某些部分依赖于lambda表达式,但我们希望它保持简单:-)

lambda表达式是匿名表达式 可以包含表达式的函数 和语句,并可用于 创建委托或表达式树 类型

这是来自MSDN的。(http://msdn.microsoft.com/en-us/library/bb397687.aspx )

要使其简短(复杂得多),可以使用lambda表达式生成局部函数。在=>(在您的示例中是c)之前放置的是函数的参数。返回类型由C#编译器“发现”

c=>c.City==“伦敦”
几乎等同于:

delegate (TheObjectTypeOfC c) {
   return c.City == London
};
(不同之处在于某些lambda表达式是委托,也是表达式,但请忽略这一点,您将在一段时间内不需要它)

如果/当编译器无法推断参数的类型时,可以强制它们:
(MyObject p)=>p.SomeProperty!=空
。在这里,您告诉编译器p是一个参数

在这里,我向您展示了所谓的“表达式lambdas”,您甚至可以执行“语句lambdas”:

p=>{
对于(int i=0;i<10;i++){
if(p.SomeProperty==0){
返回true;
}
}
返回false;
}
(我不会告诉你表达式lambdas和语句lambdas之间的“幕后”区别。如果你想知道它们,请阅读我前面提到的msdn页面)

Jon已经回答了, 但我想补充一点

在您给出的示例中,想象Linq在所有客户上循环, c只是对可枚举项中每个项的引用:

var result = new List<Customer>();
foreach(var c in customers)
{
     if (c.City == "London")
        result.Add(c);   
}
return result;
var result=newlist();
foreach(客户中的var c)
{
如果(c.City==“伦敦”)
结果.添加(c);
}
返回结果;
它是一个变量,和其他变量一样,不必是一个单独命名的变量,
但这只是某种约定。

您不需要在Lİnq to sql或实体上使用lambda表达式;这里是代码的另一种方式

您的代码是:

customers.Where(c => c.City == "London");
反之

  var query = from cs in customers
              where cs.City == "London"
              select cs;

这是另一种方式。这取决于您。

将lambdas视为匿名函数。 我将尝试用下面的代码来解释它

public bool IsLondon(Customer customer)
{
    return customer.City == "London";
}
现在我们去掉函数名并去掉大括号:

public bool Customer customer    
    return customer.City == "London";
我们不需要返回类型,因为编译器能够从表达式推断类型:

 customer.City == "London";
同样,编译器知道输入类型,所以我们不需要指定它

所以基本上,我们剩下的是

customer
   return customer.City == "London";
c#中的lambda语法基本上是:

(parameter list) => "expression"

您也可以编写“多行”表达式,但随后必须用大括号将代码括起来。此外,您还需要像通常一样使用“return”语句。

不,根本不需要

我们有两种编写LINQ查询的方法

一种是查询方法,另一种是生成器方法。对于生成器方法,您只需要放置lambda表达式。 例如,如果我们想从一些学生对象中找出分数超过70的所有学生。 但是我们可以用以下语法在LINQ中实现这一点

   var data = from p in stdList
   where p.marks > 70
   select p;
或 var数据=标准列表,其中(p=>p.marks>70)

后面的方法是builder方法,在Where函数中,我们传递lambda表达式

Lambda表达式只是做事情的捷径您可以始终使用LINQ查询,但是如果您想避免只应用简单条件而使用整个查询语法,您可以在Lambda表达式中使用LINQ生成器方法(它要求使用Lambda表达式),您总是定义一些别名,然后执行操作

就=>运算符而言,它的工作方式与赋值运算符类似。 例如:

(p) => p.Gender == “F”
It means  “All persons  p, such that person’s Gender is F”
在一些文献中,这被称为“谓词”。另一个文学术语是“投影”

(p) => p.Gender ? “F” : “Female”
“Each person p becomes string “Female” if Gender is “F”” 
这是投影,它使用三元运算符。 虽然我用非常基本的例子进行了解释,但我希望这能帮助您……:)

它们并不是完全分开的,因为查询表达式(LINQ的一部分)的转换依赖于lambda表达式。但是,可以公平地说,您可以使用LINQ库而不使用lambda表达式
(p) => p.Gender ? “F” : “Female”
“Each person p becomes string “Female” if Gender is “F””