什么=>在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()是操作)。