Enumerable.Range(0, 20).Select(i =>
{
long x = 1;
for (int j = 1; j <= i; j++)
{
x *= j;
}
Console.WriteLine(i + "计算完成");
return x;
});
当你尝试运行上面的代码,会发现并没有输出,这是为什么呢?
根据MSDN上的说法是:此方法是使用延迟执行实现的。 即时返回值是一个对象,该对象存储执行操作所需的所有信息。 此方法表示的查询在枚举对象之前不会执行,方法是通过直接调用 GetEnumerator 方法或在 Visual Basic 中使用视觉C#对象中的 foreach 或 For Each 来枚举对象。
意思就是它只是存储了一个操作,相当于存储了一个委托,只有在枚举时才执行委托。
即:将结果ToList时就会产生输出,因为ToList是会枚举对象
Enumerable.Range(0, 20).Select(i =>
{
long x = 1;
for (int j = 1; j <= i; j++)
{
x *= j;
}
Console.WriteLine(i + "计算完成");
return x;
}).ToList();
PS:不只是Select,只要是返回类型为IEnumerable的都是一样 (Where,Union,Zip,Skip,TakeWhile等)
本文深入探讨了C#中Enumerable.Range结合Select进行延迟执行的原理,解释了为何在不显式枚举的情况下,这些操作不会立即执行,并提供了使代码产生输出的具体方法。

594

被折叠的 条评论
为什么被折叠?



