gpt4 book ai didi

c# - 是否可以确定 IEnumerable 是否已延迟执行挂起?

转载 作者:可可西里 更新时间:2023-11-01 09:06:28 27 4
gpt4 key购买 nike

我有一个接受 Enumerable 的函数。我需要确保对枚举器进行评估,但如果它已在列表或其他一些“卡住”集合中准备就绪,我宁愿不创建它的副本(例如通过 ToList() 或 ToArray())。我所说的“冰雪奇缘”是指已经建立了项目集的集合,例如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() 任何不在白名单上的东西。

谢谢大家的帮助。

编辑*经过更多的思考,我意识到这等同于停机问题。所以非常不可能。

最佳答案

对我有用的东西:

IEnumerable<t> deffered = someArray.Where(somecondition);

if (deffered.GetType().UnderlyingSystemType.Namespace.Equals("System.Linq"))
{
//this is a deffered executin IEnumerable
}

关于c# - 是否可以确定 IEnumerable<T> 是否已延迟执行挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9624805/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com