我正在努力了解LINQ并对使用它充满信心.我正在努力的是要求的参数.例:
var sortedWords = words.OrderBy(a=>a.Length)
words
是一个数组集合.OrderBy
的intellisense说:
Funckeyselector
A func
执行方法,a string
是值,TKey
键.
在示例http://msdn.microsoft.com/en-us/vcsharp/aa336756.aspx#thenBySimple(ThenBy
- Comparer)中,我们通过说明来比较长度a => a.Length
.我理解语法,但这与intellisense要求的内容有何关系?
由于所有的泛型,我倾向于发现方法签名和intellisense不可读.
谢谢.
如果您了解.NET/C#中lambda表达式的本质,那么类型(由Intellisense显示)是有意义的.否则,新人确实有点奇怪.首先考虑keySelector的类型,Func
IEnumerablesortedWords = words.OrderBy(new Func (mySelectorMethod));
其中mySelectorMethod是普通方法的名称,该方法将字符串作为参数并返回int.(作为一个侧面点,我想你可以使用匿名委托,但是现在不要去那里.)另外,请注意这个例子纯粹是说明性的,因为LINQ几乎总是与.NET 3.5/C#3.0一起使用(虽然我相信它可以与.NET 2.0/C#2.0中的任何一个一起使用 - 如果我错了,有人会纠正我.从C#3.0开始,方法可以内联定义为lambda表达式,这些表达式旨在用于这些情况.如果你想得到一个正确的介绍,请阅读有关lambda表达式(上面链接)的MSDN文章,但在这里我将简单描述在这个特定上下文中的用法.正如您所说,您的代码(在C#3.0中)类似于以下内容:
var sortedWords = words.OrderBy(a => a.Length);
表达式的一部分a => a.Length
是lambda表达式,它实际上只是用于声明函数内联的简写.lambda表达式的语法在很大程度上非常简单; 在=>的左边指定了参数,通常采用的形式是(arg1,arg2,arg3),但由于在这种情况下只有一个你可以省略括号.在=>的右边是表达式,它是函数的返回值(更准确地说是lambda表达式).或者,您可以在{和}中包含带有return语句的实际代码,但这通常是不必要的.我相信C#编译器所做的是将传递给OrderBy的参数识别为lambda表达式,然后将其编译为函数并为您创建并传递委托.请注意,lambda表达式也可以转换为System.Linq.Expressions.Expression对象(可访问的表达式树)而不是委托,但这是一种不太常见的用法.无论如何,这里有很多幕后工作,但希望这至少可以澄清为什么类型Func
a => a.Length
我理解语法,但这与intellisense要求的内容有何关系?
这段代码是lambda表达式.lambda表达式是生成Anonymous方法(在本例中)或System.Linq.Expressions.Expression 的便捷方式.让我们按部分分解.
最显着的特征是=>,它从方法体中分离参数.
在=>的左侧,有一个符号:a.这是我们的匿名方法的参数声明.编译器知道我们正在调用OrderBy(),而OrderBy需要一个Func
.用于这种功能的参数是一个字符串,所以编译器确定一个必须是字符串.程序员唯一需要提供的就是名字.
在=>的右侧,有方法体.由于这是一个单行,因此隐含了return关键字.IDE提供针对智能感知一个作为一个字符串,它允许您使用length属性.
现在,考虑一下这个C#2.0 ......
IEnumerablesortedWords = Enumerable.OrderBy(words, delegate(string a) {return a.Length;});
随着C#3.0
IEnumerablesortedWords = words .OrderBy(a => a.Length);