我转换了查询语法选择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);
}
也许解释这样的事情有点棘手,但我希望有人能说出正确的话,这样才有意义:)
谢谢
答案 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
索引,其中d
是int
数组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)
两个数组具有相同的Length
,LINQ
实际上会在numbers
中循环,并将index
传递到strings
并且返回strings[index]
。
要点是numbers
不得包含任何等于或大于Length
strings
的元素