7

*虽然这是一个重复的问题,但我之前从未在代码中看到过“=>”这个表达式。如果我知道这是一个专门的 lambda 表达式,我会用谷歌搜索并自己弄清楚。谢谢!

我是使用 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)));
    }
}

资料来源:通用列表的标准差?

几个问题: => 在这里做什么?Intellisense 告诉我 'v' 是一个 int,但它从未被声明过。这是如何运作的?

4

6 回答 6

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 运算符 => 的左侧指定输入参数(如果有),并将表达式或语句块放在另一侧。例如,lambda 表达式 x => x * x 指定一个名为 x 的参数并返回 x 的平方值。您可以将此表达式分配给委托类型,如以下示例所示:

来源: 阅读 lambda 表达式

这是一个关于为什么要使用 lambdas 的问题:C# Lambda 表达式:我为什么要使用它们?

于 2013-10-04T08:44:20.527 回答
6

该运算符=>与 linq 无关 - 它是一个lambda 表达式。它用于创建匿名函数,因此您不需要为每个小东西创建完整的函数。

所以表达:

s => s + 5 

可以翻译成:

int fun(int s)
{
return s + 5;
}
于 2013-10-04T08:46:46.070 回答
1

=>lamdba 表达式的符号,这基本上是编写匿名方法的一种速写方式:)

它还会在可能的地方自动推断类型,这就是为什么 v 从未声明为 int,但编译器无论如何都将其理解为 int 的原因。

于 2013-10-04T08:44:50.090 回答
1

您也可以阅读这篇非常短的文章,它很好地总结了什么是 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 的数字,所以数字是奇数

于 2013-10-04T08:49:21.783 回答
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());
        }
    }

现在您可以比较这两个版本的代码并查看关系。

于 2013-10-04T08:55:28.943 回答
0

这是一个 lambda 表达式。

看看这篇文章:http: //msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx

将“v”作为列表的一个元素(因此类型取决于列表),“=>”表示对该元素执行的操作(Math.Pow() 是操作)。

于 2013-10-04T08:46:24.697 回答