Linq表达式中的 "=>" 符号是什么意思?

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类型,但它从未被声明。这是如何工作的?


3
谷歌Lambda在.NET中的使用是一个较大的主题,但是您可以轻松地了解相关内容。 - Tony The Lion
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表达式的信息 以下是一个有关为什么要使用lambda的SO问题: C# Lambda表达式: 为什么我需要使用它们?

9
我无法相信从维基百科直接复制粘贴的内容能够获得那么多赞。此外,这个问题很容易通过谷歌搜索得到答案,应该被关闭。 - Tony The Lion
@TonyTheLion 1. 这不是维基百科 2. 我正在准备适当的例子,现在可以在我的回答中找到 - Kamil Budziewski
在C#中,"=>"运算符有两种用法:作为lambda表达式中的lambda运算符,它将输入变量与lambda主体分开。在表达式主体定义中,它将成员名称与成员实现分开。 - Amit Kumar Verma

6

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

因此,表达式:

s => s + 5 

可以翻译为:

int fun(int s)
{
return s + 5;
}

1

=>Lamdba表达式的表示法,它基本上是写匿名方法的简写方式 :)

编译器也会自动推断类型,所以v从未被声明为int,但编译器会理解它为int。


4
这可能是一条评论而不是答案。 - apomene
1
我认为这太苛刻了。使用“=>”的问题在于,如果您不知道它与Lambda表达式有关,则很难搜索。 - guymid
1
在我看来,这没有其他答案。要么链接到有关Lambda表达式的页面,要么将一篇非常长的文章复制粘贴到这里?你建议采取什么措施来回答这个问题? - Øyvind Bråthen
@ØyvindKnobloch-Bråthen,可能是无意的,但“你真的需要阅读”暗示OP应该已经阅读了Lambda...而且你没有提供任何关于它们的描述。简要概述即可。如果不包括摘要,看起来OP确实应该知道它们是什么。 - guymid
@guymid - 这实际上是无意的。我已经编辑过了,现在更友好(也更具信息性)。我甚至在里面加了一个非常友好的笑脸!开心吗?;) - Øyvind Bråthen
显示剩余4条评论

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的数字集合,所以是奇数。

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());
        }
    }

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接