如果您了解.NET/C#中lambda表达式的本质,那么Intellisense显示的类型就有意义了。否则,对于新手来说,它确实可能会显得有点奇怪。首先考虑keySelector的类型Func<TSource, TKey>只是一个委托。在C# 3.0之前,您需要通过将委托作为参数传递来调用此类方法,例如:
IEnumerable<string> sortedWords = words.OrderBy(new Func<string, int>(mySelectorMethod))
其中mySelectorMethod是一个普通方法的名称,它接受一个字符串作为参数并返回一个整数。(顺便说一下,我想你可以使用匿名委托,但现在先不要去那里。)此外,请注意,这个例子仅仅是说明性的,因为LINQ几乎总是与.NET 3.5/C# 3.0一起使用(尽管我相信它也可以与.NET 2.0/C# 2.0一起使用-如果我错了,有人请纠正我)。自C# 3.0以来,方法可以内联定义为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以及它如何与Lambda表达式相关。正如我所说,如果您想更深入地了解LINQ / lambdas / delegates,请阅读MSDN...