4

我将查询语法选择示例从 MSDN 转换为 Lambda。它有效,我自己写的,但我无法理解下面的评论行。我的意思是,我从numbers数组中选择,但它工作正常,而不是数字显示等效字符串。它如何匹配两个数组?

  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); 
    } 

也许解释这样的事情有点棘手,但我希望有人说得对,所以这很有意义:)

谢谢

4

6 回答 6

4

.Select()其视为“创建 . 之后的任何内容的 IEnumerable” =>

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

var result = new List<string>();
foreach(var d in numbers)
{
    result.Add(strings[d]);
}
return result;
于 2013-08-02T18:46:07.110 回答
2

卑微的尝试:

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

于 2013-08-02T18:45:04.590 回答
2

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

它是您的 Select 子句,它从您的strings数组中的索引处进行选择,数组中的每个数字在d哪里dintnumbers

于 2013-08-02T18:45:42.000 回答
2

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

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

只是将整数取入数字并使用它们来索引字符串,并将其放入新的 IEnummerable 结果中。如果你仔细观察strings,你会发现:

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

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

于 2013-08-02T19:02:07.930 回答
1

我会说一些类似的东西

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

于 2013-08-02T18:45:08.247 回答
1

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

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

于 2013-08-02T18:45:36.290 回答