【发布时间】:2020-04-16 15:42:39
【问题描述】:
给定一个持有(并初始化一次)IEnumerable<T> 的类:
public class MyClass
{
public MyClass()
{
Values = Sequence(0, 10).Select(i => Convert(i));
}
public IEnumerable<string> Values { get; private set; }
private static string Convert(int i)
{
string iStr = i.ToString();
Console.WriteLine("Convert: " + iStr);
return iStr;
}
private static IEnumerable<int> Sequence(int start, int end)
{
return Enumerable.Range(start, end - start + 1);
}
}
为什么每个需要myClass.Values 评估值的用法都重新评估它们?
例如:
static void Main(string[] args)
{
MyClass myClass = new MyClass();
foreach (var v in myClass.Values)
{
Console.WriteLine(v);
}
foreach (var v in myClass.Values)
{
Console.WriteLine("Value: " + v);
}
}
这将打印 20 次“Convert:”和“Value:”。
我知道将值保存为列表(例如 ToList())可以解决这个问题,但我的理解是,一旦对值进行评估,这些值将从内存中使用(就像我使用了 Lazy<T> 和然后Values.value),为什么不一样呢?
【问题讨论】:
-
Materialize (
.ToArray(),.ToList()) 即将结果存储在一个集合中,它们将被计算一次。
标签: c# linq lazy-evaluation