【问题标题】:What does => mean in a Linq Expression [duplicate]=> 在 Linq 表达式中是什么意思[重复]
【发布时间】:2013-10-11 04:43:08
【问题描述】:

*虽然这是一个重复的问题,但我之前从未在代码中看到过“=>”这个表达式。如果我知道这是一个专门的 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)));
    }
}

来源:Standard deviation of generic list?

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

【问题讨论】:

  • .NET 中的 Google lambda。这是一个很大的主题,但您可以轻松阅读。

标签: c# linq


【解决方案1】:

这个符号=&gt; 表示 lambda 表达式

示例:

Enumerable.Range(0,100).Where(x=>x==1);

这里的x=&gt; x==1 是一个匿名委托,接受int 作为参数并返回bool。它是:

delegate bool SomeDelegate(int x);

您可以将委托的主体分配给:

bool Function(int x)
{ 
   return x==1;
}

lambda 表达式是一个匿名函数,您可以使用它 创建委托或表达式树类型。通过使用 lambda 表达式,您可以编写可以传递为的局部函数 参数或作为函数调用的值返回。拉姆达 表达式对于编写 LINQ 查询特别有帮助 表达式。

要创建 lambda 表达式,请指定输入参数(如果有) 在 lambda 运算符 => 的左侧,然后将表达式 或另一边的语句块。例如,拉姆达 表达式 x => x * x 指定一个名为 x 的参数并返回 x 的平方值。您可以将此表达式分配给委托 类型,如下例所示:

来源: Read about lambda expressions

这是一个关于为什么要使用 lambdas 的 SO 问题:C# Lambda expressions: Why should I use them?

【讨论】:

  • 我不敢相信来自维基百科的直接复制粘贴获得了如此多的支持。这个问题也很容易谷歌搜索,应该关闭
  • @TonyTheLion 1。这不是维基百科 2。我正在准备合适的例子,现在可以在我的答案中找到
  • => 运算符在 C# 中有两种使用方式: 作为 lambda 表达式中的 lambda 运算符,它将输入变量与 lambda 主体分开。在表达式主体定义中,它将成员名称与成员实现分开。
【解决方案2】:

=&gt;Lamdba expression 的符号,这基本上是编写匿名方法的一种速写方式:)

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

【讨论】:

  • 这可能是评论而不是答案
  • 我认为这很苛刻。 => 的问题在于,如果你不知道它与 Lambda 表达式有关,就很难搜索
  • 这个 imo 没有其他答案。要么链接到有关 Lambda 表达式的页面,要么将一篇非常大的文章复制粘贴到这里?你会建议做什么来回答这个问题?
  • 完全没有,之前已经回答过了。
  • @guymid - 什么是苛刻的?我根本不打算听起来刺耳:)
【解决方案3】:

这是一个 lambda 表达式。

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

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

【讨论】:

    【解决方案4】:

    为了更好地理解这一点。我会在没有 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】:

      您也可以阅读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,所以数字是奇数

      【讨论】:

        【解决方案6】:

        运算符 =&gt; 与 linq 无关 - 它是 lambda expression。它用于创建匿名函数,因此您无需为每件小事都创建完整的函数。

        所以表达式:

        s => s + 5 
        

        可以翻译成:

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

        【讨论】:

          猜你喜欢
          • 2022-01-12
          • 1970-01-01
          • 1970-01-01
          • 2013-10-13
          • 1970-01-01
          • 2015-06-21
          • 2023-03-10
          • 2014-12-06
          • 2015-02-24
          相关资源
          最近更新 更多