在使用LINQ时是必须使用lambda表达式还是lambda表达式是可选的?Lambda表达式语法
在lambda表达式中,总是使用符号=>
。这是什么意思?
customers.Where(c => c.City == "London");
这里c =>
使用,但为什么呢? 用什么样的意思c =>
。请详细讨论,因为我不知道lambda。
在使用LINQ时是必须使用lambda表达式还是lambda表达式是可选的?Lambda表达式语法
在lambda表达式中,总是使用符号=>
。这是什么意思?
customers.Where(c => c.City == "London");
这里c =>
使用,但为什么呢? 用什么样的意思c =>
。请详细讨论,因为我不知道lambda。
Lambda表达式
c => c.City == "London"
是简写形式,像
bool IsCustomerInLondon(Customer c)
{
return (c.City == "London");
}
这只是一个写一个简单的函数返回一个值的非常简洁的方式。它被称为“匿名函数”,因为它从来没有被分配一个名称或一个正式的定义(参数类型和返回类型是从上下文中推断出来的)。
(其实,这不是只是速记; lambda表达式都涉及到一些其他的结构称为closures,这是非常冷静和强大的工具。)
不,你不要有使用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章中有详细介绍。
哈,你在我之前编辑过:p – TimothyP 2011-02-22 18:42:05
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页面)
它们不是完全独立的,因为查询表达式(它是LINQ的一部分)的翻译依赖于lambda表达式。然而,它*很公平地说,你可以在不使用lambda表达式的情况下使用LINQ库。 – 2011-02-22 18:45:19
Jon已经回答了, 但我想补充一点。
在你给的例子,想象的LINQ遍历所有的客户, c是简单地在枚举的每个项目的引用:
var result = new List<Customer>();
foreach(var c in customers)
{
if (c.City == "London")
result.Add(c);
}
return result;
这就像任何其他的变量,它没有成为一个单一的名字, 但它只是一种约定。
您不需要在Lİnq上将lambda表达式用于sql或Entities;这里是你的代码的另一种方式;
你代码:
customers.Where(c => c.City == "London");
的其他方式;
var query = from cs in customers
where cs.City == "London"
select cs;
这是另一种方式。它是由你决定。
将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”语句。
不,根本没有必要。
我们有两种编写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””
这是投影,它使用三元运算符。 虽然我用非常基本的例子解释,但我希望这可以帮助你。 。 。 :)
请注意,lambda表达式也可以转换为表达式树。 – 2011-02-22 18:52:26