当前位置:  开发笔记 > 编程语言 > 正文

对LINQ参数感到困惑

如何解决《对LINQ参数感到困惑》经验,为你挑选了2个好方法。

我正在努力了解LINQ并对使用它充满信心.我正在努力的是要求的参数.例:

var sortedWords = words.OrderBy(a=>a.Length)

words是一个数组集合.OrderBy的intellisense说:

Func keyselector

A func执行方法,a string是值,TKey键.

在示例http://msdn.microsoft.com/en-us/vcsharp/aa336756.aspx#thenBySimple(ThenBy- Comparer)中,我们通过说明来比较长度a => a.Length.我理解语法,但这与intellisense要求的内容有何关系?

由于所有的泛型,我倾向于发现方法签名和intellisense不可读.

谢谢.



1> Noldorin..:

如果您了解.NET/C#中lambda表达式的本质,那么类型(由Intellisense显示)是有意义的.否则,新人确实有点奇怪.首先考虑keySelector的类型,Func 只是一个委托.在C#3.0之前,您可以通过将委托作为参数传递来调用这样的方法,例如:

IEnumerable sortedWords = 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.Lengthlambda表达式,它实际上只是用于声明函数内联的简写.lambda表达式的语法在很大程度上非常简单; 在=>的左边指定了参数,通常采用的形式是(arg1,arg2,arg3),但由于在这种情况下只有一个你可以省略括号.在=>的右边是表达式,它是函数的返回值(更准确地说是lambda表达式).或者,您可以在{和}中包含带有return语句的实际代码,但这通常是不必要的.我相信C#编译器所做的是将传递给OrderBy的参数识别为lambda表达式,然后将其编译为函数并为您创建并传递委托.请注意,lambda表达式也可以转换为System.Linq.Expressions.Expression对象(可访问的表达式树)而不是委托,但这是一种不太常见的用法.无论如何,这里有很多幕后工作,但希望这至少可以澄清为什么类型Func 以及它与lambda表达式的关系.正如我所说,如果你想更深入地了解LINQ/lambdas/delegates,请阅读MSDN ...



2> Amy B..:
a => a.Length

我理解语法,但这与intellisense要求的内容有何关系?

这段代码是lambda表达式.lambda表达式是生成Anonymous方法(在本例中)或System.Linq.Expressions.Expression 的便捷方式.让我们按部分分解.

最显着的特征是=>,它从方法体中分离参数.

=>的左侧,有一个符号:a.这是我们的匿名方法的参数声明.编译器知道我们正在调用OrderBy(),而OrderBy需要一个Func.用于这种功能的参数是一个字符串,所以编译器确定一个必须是字符串.程序员唯一需要提供的就是名字.

=>的右侧,有方法体.由于这是一个单行,因此隐含了return关键字.IDE提供针对智能感知一个作为一个字符串,它允许您使用length属性.

现在,考虑一下这个C#2.0 ......

IEnumerable sortedWords = 
  Enumerable.OrderBy(words, delegate(string a) {return a.Length;});

随着C#3.0

IEnumerable sortedWords = words
  .OrderBy(a => a.Length);

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有