什么=>在Linq表达式中表示
*虽然这是一个重复的问题,但我之前从未见过代码中的“=>”。 如果我知道这是一个特别的lambda表达式,我会google’d并自己想出来。 谢谢!
我是新手使用Linq,所以当我在这段代码中遇到它时,使用“=>”确实让我很困惑:
using System; using System.Linq; using System.Collections.Generic; public static class Extend { public static double StandardDeviation(this IEnumerable values) { double avg = values.Average(); return Math.Sqrt(values.Average(v=>Math.Pow(v-avg,2))); } }
资料来源: 通用清单的标准差?
几个问题:=>做什么? Intellisense告诉我’v’是一个int,但它从未声明过。 这是如何运作的?
这种表示法=>
表示lambda表达式
例:
Enumerable.Range(0,100).Where(x=>x==1);
这里x=> x==1
是一个匿名委托,接受int
作为参数并返回bool
。 它是:
delegate bool SomeDelegate(int x);
并且您可以将委托的主体分配给:
bool Function(int x) { return x==1; }
lambda表达式是一个匿名函数,可用于创建委托或表达式树类型。 通过使用lambda表达式,您可以编写可以作为参数传递或作为函数调用的值返回的本地函数。 Lambda表达式对于编写LINQ查询表达式特别有用。
要创建lambda表达式,请在lambda运算符=>的左侧指定输入参数(如果有),并将表达式或语句块放在另一侧。 例如,lambda表达式x => x * x指定一个名为x的参数,并返回x平方的值。 您可以将此表达式分配给委托类型,如以下示例所示:
source: 阅读lambda表达式
这是一个关于为什么要使用lambdas的问题: C#Lambda表达式:我为什么要使用它们?
operator =>
与linq无关 – 它是一个lambda表达式 。 它用于创建匿名函数,因此您不需要为每个小东西创建一个完整的函数。
所以表达式:
s => s + 5
可以翻译成:
int fun(int s) { return s + 5; }
您还可以阅读这篇非常简短的文章 ,它是什么是lambda表达式,如何使用它以及何时使用它的非常好的总结。
给出的例子是
List numbers = new List {11,37,52}; List oddNumbers = numbers.where(n => n % 2 == 1).ToList(); //Now oddNumbers is equal to 11 and 37
在第2行, oddNumbers
现在等于数字number % 2
等于1的数字,因此数字是奇数
为了更好地理解这一点 我会在没有LINQ的情况下重写你的代码,如下所示:
public static class Extend { public static double StandardDeviation(this IEnumerable values) { double avg = values.Average(); var newValues = new List (); foreach (var v in values) { newValues.Add(Math.Pow(v - avg, 2)); } return Math.Sqrt(newValues.Average()); } }
现在您可以比较这两个版本的代码并查看关系。
=>
是Lamdba表达式的表示法,这基本上是编写匿名方法的一种写法:)
它也会自动推断它可以的类型,这就是为什么v永远不会被声明为int,但是编译器将其理解为int无论如何。
这是一个lambda表达式。
看看这篇文章: http : //msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx
将“v”作为列表的元素(因此类型取决于列表),“=>”表示对此元素执行的操作(Math.Pow()是操作)。