用简单的英语解释这个lambda表达式怎么样?

时间:2013-08-02 18:42:48

标签: c# linq lambda

我转换了查询语法选择MSDN中的示例到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); 
    } 

也许解释这样的事情有点棘手,但我希望有人能说出正确的话,这样才有意义:)

谢谢

6 个答案:

答案 0 :(得分:4)

.Select()视为“在=>之后创建IEnumerable。”

作为一个foreach,它看起来像:

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

答案 1 :(得分:2)

谦虚的尝试:

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

答案 2 :(得分:2)

  

我从数字数组中选择,但它工作正常而不是   数字显示等效字符串。

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

答案 3 :(得分:2)

我认为看起来很奇怪的原因是以数据为例。这一行:

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

只是将数字中的整数取出并使用它们来索引字符串,并将其放入新的IEnummerable结果中。如果仔细查看strings,您会注意到:

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

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

答案 4 :(得分:1)

我会说

  

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

答案 5 :(得分:1)

两个数组具有相同的LengthLINQ实际上会在numbers中循环,并将index传递到strings并且返回strings[index]

要点是numbers不得包含任何等于或大于Length

strings的元素