什么=>在Linq表达中意味着

时间:2013-10-04 08:42:34

标签: c# linq

*虽然这是一个重复的问题,但我从未见过表达式“=>”在代码之前。如果我知道这是一个特别的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,但它从未声明过。这是如何工作的?

6 个答案:

答案 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()是操作)。