2011-02-22 68 views
7

在使用LINQ时是必须使用lambda表达式还是lambda表达式是可选的?Lambda表达式语法

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

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

这里c =>使用,但为什么呢? 用什么样的意思c =>。请详细讨论,因为我不知道lambda。

回答

7

Lambda表达式

c => c.City == "London" 

是简写形式,像

bool IsCustomerInLondon(Customer c) 
{ 
    return (c.City == "London"); 
} 

这只是一个写一个简单的函数返回一个值的非常简洁的方式。它被称为“匿名函数”,因为它从来没有被分配一个名称或一个正式的定义(参数类型和返回类型是从上下文中推断出来的)。

(其实,这不是只是速记; lambda表达式都涉及到一些其他的结构称为closures,这是非常冷静和强大的工具。)

+0

请注意,lambda表达式也可以转换为表达式树。 – 2011-02-22 18:52:26

11

不,你不要使用lambda表达式。例如,您Where例子可以写成:

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

... 

var londoners = customers.Where(IsLondon); 

这是假设LINQ到对象,当然。对于LINQ to SQL等,你需要建立一个表达式树。

至于为什么“=>”总是用在lambda表达式中,那只是因为这就是操作符编写的方式 - 就像问为什么用“+”来加法。

的“C => ...”被有效地赋予lambda表达式一个参数称为c ...在这种情况下一般类型推理lambda表达式提供类型的c。正文提供了一个要执行的动作或一些计算来返回基于c的值。

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

+0

哈,你在我之前编辑过:p – TimothyP 2011-02-22 18:42:05

1

Lambda和LINQ是完全分离。您可以使用一个不使用其他(有依赖于lambda表达式LINQ的部分,但我们要保持它的简单:-))

lambda表达式是匿名 功能,可以包含表达式 和陈述,并可用于 创建代表或表达式树 类型。

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

为了缩短它(更复杂),可以使用lambda表达式来创建本地函数。你在=>之前放置了什么(在你的例子中,c)将是函数的参数。返回类型是C#编译器“发现”的。

c => c.City == "London"几乎相当于:

delegate (TheObjectTypeOfC c) { 
    return c.City == London 
}; 

(不同的是,一些lambda表达式的代表也表达,但请忽略这一点,你就不必了一段时间)

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

而在这里我给你什么是所谓的“表达lambda表达式”,你甚至可以做“lambda表达式”:

p => { 
    for (int i = 0; i < 10; i++) { 
     if (p.SomeProperty == 0) { 
      return true; 
     } 
    } 

    return false; 
} 

(我不会告诉你什么是之间的“幕后”的差异如果你想知道它们,请阅读我之前指出的msdn页面)

+0

它们不是完全独立的,因为查询表达式(它是LINQ的一部分)的翻译依赖于lambda表达式。然而,它*很公平地说,你可以在不使用lambda表达式的情况下使用LINQ库。 – 2011-02-22 18:45:19

1

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

在你给的例子,想象的LINQ遍历所有的客户, c是简单地在枚举的每个项目的引用:

var result = new List<Customer>(); 
foreach(var c in customers) 
{ 
    if (c.City == "London") 
     result.Add(c); 
} 
return result; 

这就像任何其他的变量,它没有成为一个单一的名字, 但它只是一种约定。

1

您不需要在Lİnq上将lambda表达式用于sql或Entities;这里是你的代码的另一种方式;

你代码:

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

的其他方式;

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

这是另一种方式。它是由你决定。

4

将lambda认为是函数的匿名。 我会尝试用下面的代码来解释它。

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”语句。

1

不,根本没有必要。

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

一个是查询方法,另一个是构建方法。你只需要在构建器方法中使用lambda表达式。 例如,如果我们要找出所有从一些学生对象中具有多个标记比70 这些学生,但我们可以做LINQ这件事情有以下语法

var data = from p in stdList 
    where p.marks > 70 
    select p; 

或 VAR数据= stdList.Where (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”” 

这是投影,它使用三元运算符。 虽然我用非常基本的例子解释,但我希望这可以帮助你。 。 。 :)