【问题标题】:What is the "=>" sign in LINQ queries?LINQ 查询中的“=>”符号是什么?
【发布时间】:2015-04-10 07:38:12
【问题描述】:

令人惊讶的是,这方面的信息如此之少。我发现了大量解释 LINQ 的教程,但它们没有解释这个特定的运算符:

var Results = UserFavoritesContext.UserFavorites.Select(color => color.FavoriteColor);

"x => x.y"

有人可以解释一下这是如何工作的吗?我掌握了通用语法并能够使用它进行查询,但这就像在不知道自己在做什么的情况下做某事。

【问题讨论】:

标签: c# asp.net linq


【解决方案1】:

假设您有一个people 列表,并且您想遍历它们。你会写这样的东西:

foreach(var person in people)
{
       //do something to person
}

请注意您自己是如何选择名称 person。它可以是任何词,但您基本上是说“将列表中的每一项处理为我的person 变量”。

现在看看这个 LINQ 查询:

filteredPeopleList = people.Where(person => person.Name == "John");

同样,您基本上选择了person 作为原始列表中每个对象的占位符名称(一次一个)。上面的 Linq 查询等价于

foreach(var person in people)
{
       if(person.Name == "John")
       {
           filteredPeopleList.Add(person);
       }
}

对我来说,x => x.y 基本上是在说“对于我们处理的每个变量(我们称之为x),请对其执行以下操作(x.y,获取y 属性)”

我希望能解释清楚。

编辑
正如现在删除他的评论的评论者所提到的,这并非专门用于 LINQ。 lambda 表达式不必遍历 IEnumerable,它可用于处理单个项目。
然而,LINQ 是迄今为止遇到 lambda 的最常见的地方,我发现它们的使用与 foreach 循环非常相似,这就是我选择这个示例的原因。

【讨论】:

    【解决方案2】:

    => 运算符用于 lambda 表达式。

    考虑这一点的最好方法是编写函数的一种语法类型,其中运算符的左侧是函数的参数,右侧是函数的主体,例如这是对 lambda 表达式的有效使用,它像函数一样使用:

    Func<int, int> incrementFunction = i => i + 1;
    int incrementedNumber = incrementFunction(1);
    

    在这种情况下,名称 i 是任意变量名称,例如就像您命名函数输入参数一样。请注意,我不需要声明输入参数类型,因为编译器会推断它。另请注意,我不需要包含“return”关键字或将函数体包含在代码块中。它也不一定需要任何参数,例如

    Action myAction = () => Console.Write("something");
    myAction();
    

    当您在 linq 表达式中使用它时,可以将其想象为对集合中的每个元素都调用了 lambda 函数(我相信这正是 linq to objects 发生的情况)。

    【讨论】:

      【解决方案3】:

      这是 Lambda 表达式的语法。如果它可以帮助您记住... 简而言之,要传递的参数(参数)在 => 的左侧,使用它的方法在它的右侧。

      我希望这个简短的摘要足以解释它:)

      【讨论】:

        【解决方案4】:

        这是一个 lambda 表达式,它可以用作对象的选择器

        当表达式为真时,您可以有条件地选择(或其他操作 orderby、count 等)。例如:

        假设您有一个人员列表及其详细信息:ID、姓名、城市和职业。

        您可以通过使用 lambda 搜索其特定 ID 来选择一个人:

        public Person GetByID(int id)
        {
        Person selectedPerson = people.SingleOrDefault(person => person.ID == id);
        return selectedPerson;
        }
        

        同样可以应用于一个城市的选择,这将是:

        public List<Person> GetByCity(string city)
        {
        List<Person> selectedPeople = people.where(person => person.City == city);
        return selectedPeople;
        }
        

        lamda 表达式是您放置操作变量的位置,因此在这些情况下是您选择数据的条件。您可以以相同的方式将其用作 orderby 变量,在下一个示例中,我使用两个 lamdas 执行两个单独的功能

        public List<Person> GetByCity(string city)
        {
        List<Person> selectedPeople = people.where(person => person.city == city)
        .OrderByDescending(person => person.Name);
        return selectedpeople;
        }
        

        我希望这会有所帮助

        【讨论】:

          【解决方案5】:

          x =&gt; x.y 是 C# 3.0 引入的 Lambda 表达式。一般语法是

          参数 => 执行代码

          Lambda 表达式有 3 个部分:

          1. 左侧的x是参数。可以是变量、委托或匿名函数。
          2. => 读作“goes to”,充当分隔符
          3. x.y 是要计算的表达式。

          例如,lambda 表达式 x => x * x 指定一个名为 x 的参数并返回 x 的平方值(来源:MSDN)。

          希望这会对你有所帮助。

          【讨论】:

            【解决方案6】:

            它们被称为Lamda表达式:

            https://msdn.microsoft.com/en-us/library/bb397687.aspx

            var Results = UserFavoritesContext.UserFavorites.Select(color => color.FavoriteColor);
            

            类似于:

            List<UserFavorite> Results = new List<UserFavorite>();
            foreach(var item in UserFavorites)
            {
               Results.Add(item.FavoriteColor);
            }
            

            【讨论】:

            • 更像yield return ...,而不是列表:惰性求值。
            【解决方案7】:

            这不是 Linq 特有的。

            这是您编写 lambda 表达式的方式。 箭头 => 是 lambda 参数与其主体之间的分隔符。

            【讨论】:

              猜你喜欢
              • 2014-09-14
              • 1970-01-01
              • 2014-02-27
              • 1970-01-01
              • 2013-10-30
              • 2019-06-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多