我有一个接受 Enumerable 的函数。我需要确保对枚举数进行评估,但如果它在 List 或其他一些“冻结”集合中准备就绪,我宁愿不创建它的副本(例如通过 ToList() 或 ToArray())。Frozen 是指已经建立项目集的集合,例如 List、Array、FsharpSet、Collection 等,而不是像 Select() 和 where() 这样的 linq 东西。
是否可以创建一个函数“ForceEvaluation”来确定可枚举是否已延迟执行待处理,然后评估可枚举?
public void Process(IEnumerable<Foo> foos)
{
IEnumerable<Foo> evalutedFoos = ForceEvaluation(foos)
EnterLockedMode(); // all the deferred processing needs to have been done before this line.
foreach (Foo foo in foos)
{
Bar(foo);
}
}
public IEnumerable ForceEvaluation(IEnumerable<Foo> foos)
{
if(??????)
{ return foos}
else
{return foos.ToList()}
}
}
经过更多研究后,我意识到这在任何实际意义上几乎是不可能的,并且需要对每个迭代器进行复杂的代码检查。
因此,我将采用 Mark 答案的变体,并创建一个已知安全类型的白名单,然后调用 ToList() 任何不在白名单上的东西。
感谢大家的帮助。
编辑* 经过更多思考,我意识到这相当于停机问题。所以非常不可能。