【发布时间】:2020-03-08 03:26:53
【问题描述】:
我一直在玩 Lists 和 Enumerables,我想我了解了基础知识:
- 可枚举:每次使用元素时都会对其进行评估。
- 列表:元素根据定义进行评估,不会在任何时候重新评估。
我做了一些测试:
- 可枚举。 https://www.tutorialspoint.com/tpcg.php?p=bs75zCKL
- 名单:https://www.tutorialspoint.com/tpcg.php?p=PpyY2iif
- SingleEvaluationEnum:https://www.tutorialspoint.com/tpcg.php?p=209Ciiy7
从 Enumerable 示例开始:
var myList = new List<int>() { 1, 2, 3, 4, 5, 6 };
var myEnumerable = myList.Where(p =>
{
Console.Write($"{p} ");
return p > 2;
}
);
Console.WriteLine("");
Console.WriteLine("Starting");
myEnumerable.First();
Console.WriteLine("");
myEnumerable.Skip(1).First();
输出是:
Starting
1 2 3
1 2 3 4
如果我们在.Where(...) 之后添加.ToList(),则输出为:
1 2 3 4 5 6
Starting
我也能够在这门课上两全其美:
class SingleEvaluationEnum<T>
{
private IEnumerable<T> Enumerable;
public SingleEvaluationEnum(IEnumerable<T> enumerable)
=> Enumerable = enumerable;
public IEnumerable<T> Get()
{
if (!(Enumerable is List<T>))
Enumerable = Enumerable.ToList().AsEnumerable();
return Enumerable;
}
}
可以看到输出是:
Starting
1 2 3 4 5 6
这样,评估将推迟到第一次消费,并且不会在下一次消费中重新评估。但是整个列表都会被评估。
我的问题是:有没有办法得到这个输出?
Starting
1 2 3
4
换句话说:我希望myEnumerable.First() 只评估必要的元素,而不是更多。我希望myEnumerable.Skip(1).First() 重用已评估的元素。
编辑:澄清:我希望对 Enumerable 的任何“查询”都适用于列表中的所有元素。这就是 (AFAIK) 枚举器不起作用的原因。
谢谢!
【问题讨论】:
标签: c# .net list lazy-evaluation enumerable