2010-11-05 72 views
2

我使用LINQpad得到LINQ的把握和在他们下面的代码理解=>在LINQ

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"

到底是什么XML的例子之一去那里?

+4

仅供参考,这是一个lambda /匿名函数,而不是LINQ特定功能。 – delnan 2010-11-05 13:56:54

回答

2

Lambda表达式,IOW是一个内联定义的函数。

编译器实际上将Lambda转换为一个具有引用lambda所做事情的字段的类。如果你打开一个包含lambda表达式的程序集,你会看到这些具有奇怪名称的类,如<string>b_0() : Void

Lambdas还依赖于编译器的大量类型推断。虽然您可以明确说明lambda中涉及的类型,但您通常可以让编译器自行找出它。毫无疑问,编译器确保lambda是强类型的,即使您没有指定它们。

此功能:

public string Foo(int bar) 
{ 
    return bar.ToString(); 
} 

可以表示为在以下方面lambda表达式:

x => x.ToString() 

bar => bar.ToString() 

int bar => bar.ToString() 

(int bar) => 
{ 
    return bar.ToString(); 
} 

他们都是等价的。

0

这意味着任何工具的Value属性(它是每个元素中的字符数据)等于“Nailgun”。 As Any()遍历工具箱中的工具,lambda表达式被执行,并且它的结果(一个bool)从lambda表达式返回。

3

这是一个用于快速指定匿名函数的C#Lambda Expression。如果tool.Value是“Nailgun”,则此特定的lambda函数返回true。

1

它被称为lambda,并且本身不是LINQ功能。

这意味着它将匹配工具值等于“Nailgun”的任何元素。

1

=>是C#中的lambda operator。在这种情况下,你调用Linq Any()函数,该函数接受一个谓词,一个函数接受一些参数并返回一个布尔值。谓词通常用于确定是否选择一个项目。 Linq为集合中的每个工具调用这个lambda谓词。

=>的左侧是lambda参数,在这种情况下,要测试的工具是右侧的布尔表达式,仅当工具的值为“Nailgun”时才返回true。因此,只有其中一个工具是钉枪时,Any()函数才会返回true。