这个lambda表达式的英文含义是什么?请用通俗易懂的语言进行解释。

4

我将 MSDN 上的一个查询语法 Select 示例转换为 Lambda。它可以工作,我已经自己写了出来,但是我无法理解下面被注释的行。我的意思是,我正在从 numbers 数组中进行选择,但它却可以正常工作,并且不是显示 digits 而是显示等价字符串。它是如何匹配这两个数组的?

  int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
  string[] strings = {"zero", "one", "two", "three", "four",
                       "five", "six", "seven", "eight", "nine" }; 

  //Confusing line: **How would we represent this line below in plain english?**
  var result = numbers.Select(d => strings[d]);
  foreach (var d in result)

  {
   Console.WriteLine(d); 
  }

输出:

five 
four
one 
..rest of numbers follow

使用查询语法的原始MSDN代码:

var result= 
        from n in numbers 
        select strings[n];       

    foreach (var s in strings) 
    { 
        Console.WriteLine(s); 
    } 

也许解释这样的事情有点棘手,但我希望有人能用恰当的话语来使其变得更加清晰易懂 :)
谢谢。

lambda语法只是循环的简写。d => ...意味着foreach d ... - jbabey
为什么在你的第二个例子中,你要迭代strings而不是result - Oded
@jbabey:你是指在.Select()方法中使用lambda语法吗? - mao47
@mao47 有没有 LINQ 方法,其中 lambda 表达式不表示循环? - jbabey
@jbabey:我改口了,你的意思是LINQ扩展方法中的lambda语法。但它仍然不是全部的lambda语法,就像你原来的评论所暗示的那样。 - mao47
6个回答

5

.Select() 看作“创建一个IEnumerable,其中包含在 => 之后的任何内容。”

作为 foreach 语句,它看起来像这样:

var result = new List<string>();
foreach(var d in numbers)
{
    result.Add(strings[d]);
}
return result;

3

我认为这个看起来奇怪的原因是使用的示例数据。这一行:

var result = numbers.Select(d => strings[d]);

简单来说,就是将数字中的整数用作字符串的索引,并将其放入一个新的IEnumerable结果中。如果您仔细观察strings,您会注意到:

strings[0] = "zero"
strings[1] = "one"
strings[2] = "two"
... and so on

因此,strings数组实际上是充当了一个字典的角色,允许您通过提供一个int来查找数字的字符串表示。这意味着当您在查询中索引 strings[d] 时,您将从 numbers 中获取整数,并将该值转换为字符串。


3

一个简单的尝试:

“对于列表numbers中的每个数字,从称为strings的字符串列表中选择相应位置的字符串。”


3
我从数字数组中进行选择,它正常工作并显示相应的字符串,这是由于您的Select语句在您的strings数组中选择了索引为d的元素,其中d是numbers int数组中的每个数字。

1

我会说大概是这样的:

遍历 numbers 数组中的每个整数,选择在 strings 数组中该整数位置上的元素,并将其放入一个 IEnumerable 集合中。


1
这两个数组具有相同的长度,实际上LINQ通过一些循环遍历numbers,将index传递到strings中并返回strings[index]。关键是numbers不能包含任何等于或大于strings长度的元素。

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