我正在使用LINQpad来掌握LINQ,在其中一个XML示例中,他们有以下代码
var bench =
new XElement ("bench",
new XElement ("toolbox",
new XElement ("handtool", "Hammer"),
new XElement ("handtool", "Rasp")
),
new XElement ("toolbox",
new XElement ("handtool", "Saw"),
new XElement ("powertool", "Nailgun")
),
new XComment ("Be careful with the nailgun")
);
var toolboxWithNailgun =
from toolbox in bench.Elements()
where toolbox.Elements().Any (tool => tool.Value == "Nailgun")
select toolbox.Value;
我对tool => tool.Value == "Nailgun"
到底发生了什么?
答案 0 :(得分:3)
这是一个C#Lambda Expression,用于快速指定匿名函数。如果tool.Value是“Nailgun”
,则此特定lambda函数返回true答案 1 :(得分:2)
Lambda表达式,IOW内联定义的函数。
编译器实际上将Lambda转换为一个类,该类具有引用lambda所做的所有内容的字段。如果打开包含lambda表达式的程序集,您将看到这些类具有奇怪的名称,例如<string>b_0() : Void
。
Lambdas还依赖于编译器的大量类型推断。虽然你可以明确说明lambda中涉及的类型,但通常可以让编译器自己解决它。毫无疑问,编译器确保lambda是强类型的,即使你没有指定它们。
此功能:
public string Foo(int bar)
{
return bar.ToString();
}
可以通过以下方式表示为lambdas:
x => x.ToString()
bar => bar.ToString()
int bar => bar.ToString()
(int bar) =>
{
return bar.ToString();
}
它们都是等价的。
答案 2 :(得分:1)
它被称为lambda,本身不是LINQ功能。
这意味着它将匹配工具值等于“Nailgun”的任何元素。
答案 3 :(得分:1)
这将是Lambda Operator的典型示例(在Lambda Expression内部)。
答案 4 :(得分:1)
=>
是C#中的lambda operator。在这种情况下,您将调用Linq Any()函数,该函数接受谓词,该函数接受一些参数并返回布尔值。谓词通常用于确定是否选择项目。 Linq为集合中的每个工具调用此lambda谓词。
在=>
的左边是lambda参数,在这种情况下是要测试的工具,在右边是一个布尔表达式,只有当工具的值为“Nailgun”时才返回true。因此,只有当其中一个工具是钉枪时,Any()函数才返回true。
答案 5 :(得分:0)
这意味着任何其Value属性(每个元素中的字符数据)等于“Nailgun”的工具。当Any()遍历工具箱中的工具时,将执行lambda表达式,并从lambda表达式返回其结果(bool)。