*虽然这是一个重复的问题,但我从未见过表达式“=>”在代码之前。如果我知道这是一个特别的lambda表达式,我会google'd并自己想出来。谢谢!
我是使用Linq的新手,所以使用“=>”当我在这段代码中遇到它时,我真的很困惑:
using System;
using System.Linq;
using System.Collections.Generic;
public static class Extend
{
public static double StandardDeviation(this IEnumerable<double> values)
{
double avg = values.Average();
return Math.Sqrt(values.Average(v=>Math.Pow(v-avg,2)));
}
}
来源:Standard deviation of generic list?
几个问题: 什么=&gt;在这做? Intellisense告诉我'v'是一个int,但它从未声明过。这是如何工作的?
答案 0 :(得分:8)
此表示法=>
表示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 operator =&gt;的左侧,你放了表达式 或另一方的声明块。例如,lambda 表达式x =&gt; x * x指定一个名为x并返回的参数 x平方的值。您可以将此表达式分配给委托 类型,如以下示例所示:
源: Read about lambda expressions
这是一个关于为什么要使用lambdas的问题:C# Lambda expressions: Why should I use them?
答案 1 :(得分:6)
运算符=>
与linq无关 - 它是lambda expression。它用于创建匿名函数,因此您不需要为每个小东西创建一个完整的函数。
所以表达式:
s => s + 5
可以翻译为:
int fun(int s)
{
return s + 5;
}
答案 2 :(得分:1)
=>
是Lamdba expression的表示法,基本上是编写匿名方法的一种写法:)
它也会自动推断它可以的类型,这就是为什么v永远不会被声明为int,但是编译器将其理解为int无论如何。
答案 3 :(得分:1)
你也可以阅读this very short article,它是什么是lambda表达式,如何使用它以及何时使用的非常好的总结。
给出的例子是
List<int> numbers = new List<int>{11,37,52};
List<int> oddNumbers = numbers.where(n => n % 2 == 1).ToList();
//Now oddNumbers is equal to 11 and 37
在第2行,oddNumbers
现在等于number % 2
等于1的数字,所以数字为奇数
答案 4 :(得分:1)
为了更好地理解这一点。我会在没有LINQ的情况下重写代码,如下所示:
public static class Extend
{
public static double StandardDeviation(this IEnumerable<double> values)
{
double avg = values.Average();
var newValues = new List<double>();
foreach (var v in values)
{
newValues.Add(Math.Pow(v - avg, 2));
}
return Math.Sqrt(newValues.Average());
}
}
现在您可以比较这两个版本的代码并查看关系。
答案 5 :(得分:0)
这是一个lambda表达式。
看看这篇文章:http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx
将“v”作为列表的元素(因此类型取决于列表),并且“=&gt;”表示要对此元素执行的操作(Math.Pow()是操作)。