我有以下代码:
class Program
{
static void Main(string[] args)
{
Console.Write("By ForEach : ");
Enumerable.Range(0, 5).ToList().ForEach(i => { Console.Write(i); });
Console.WriteLine("");
Console.Write("By Select : ");
Enumerable.Range(0, 5).ToList().Select(i => { Console.Write(i); return i; });
Console.WriteLine("");
using (var sw = new StreamWriter("out.txt"))
{
sw.Write("By ForEach : ");
Enumerable.Range(0, 5).ToList().ForEach(i => { sw.Write(i); });
sw.WriteLine("");
sw.Write("By Select : ");
Enumerable.Range(0, 5).ToList().Select(i => { sw.Write(i); return i; });
sw.WriteLine("");
}
}
}
通过运行此命令,我在Console和out.txt中得到了以下结果。 :
By ForEach : 01234
By Select :
我想知道的要点是:
答案 0 :(得分:4)
Console.Write
和Streamwriter.Write
的输出在哪里?
ForEach
执行立即传入的委托。 .Select
只创建一个查询,其执行被推迟到您实际迭代之后。如果您在ToList
:
Select
,则会看到输出结果
Enumerable.Range(0, 5).ToList().Select(i => { Console.Write(i); return i; }).ToList();
然而 - Linq 意味着用于执行具有副作用的代码。您只需致电ToList
即可拨打ForEach
这一事实表明您没有使用正确的工具来完成您的工作。如果要输出所有数字,只需使用传统的foreach
循环:
foreach(int i in Enumerable.Range(0, 5))
{
Console.Write(i);
}
Select
旨在将集合和转换或项目带到新集合。 不意味着要根据输入替换您想要执行某些操作的传统foreach
循环。