用通俗易懂的英语解释这个lambda表达式

本文关键字:lambda 表达式 解释 通俗易懂 英语 | 更新日期: 2023-09-27 18:25:56

我将MSDN中的查询语法Select example转换为Lambda。它很有效,我自己也写过,但我无法理解下面的评论。我的意思是,我正在数字数组中选择,但它运行良好,显示等价字符串而不是的数字。它是如何匹配这两个数组的?

  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表达式

.Select()视为"创建=>之后的IEnumerable。"

作为foreach,它看起来像:

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

一个谦虚的尝试:

"对于名为numbers的列表中的每个数字,从名为strings的字符串列表中取相应位置的字符串。"

我从数字数组中进行选择,但它运行良好的数字显示等效字符串。

这是您的Select子句,它从d索引处的strings数组中进行选择,其中dint数组numbers 中的每个数字

我认为它看起来很奇怪的原因是用作示例的数据。此行:

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

就是简单地取数字中的整数并使用它们为字符串编制索引,然后将其放入新的IEnumerable结果中。如果你仔细观察strings,你会注意到:

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

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

我想说一些类似的东西

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

这两个数组具有相同的Length,而LINQ实际上通过numbers进行了一些循环,将index传递到strings并返回strings[index]

关键是numbers不能包含任何等于或大于stringsLength的元素