有没有办法确定IEnumerable <T>是序列生成器还是真正的集合?

Kug*_*gel 4 c# linq

让我举一个例子:

假设我有一个方法:

public void DoStuff(IEnumerable<T> sequence)
{
    if (/* is lazy sequence */) throw ...

    // Do stuff...
}
Run Code Online (Sandbox Code Playgroud)

我想要防范潜在的无限序列.

编辑:

详细说明,防范无限收集只是其中一种用途.正如乔恩所说.你可以轻松拥有无限的IList.好点子.

其他用途可能是检测数据是否可能无法重复.像一个随机发电机.真正的集合已将数据存储在内存中,并且迭代两次将为我提供相同的数据.

Jon*_*eet 5

什么都没有保证,没有.您可以看到序列是否也实现了IList<T>- 这将禁止迭代器块实现,但仍然可以是永远持续的"虚拟"列表,并且对于其他一些有限的非迭代器块集合也会失败.

就你想要保护的内容而言,一个20亿长的序列是否适合你想要做的事情?如果你最终获得超过一些"限制"(但是这样懒得)的扩展方法会引发异常吗?(像Take这样的东西,但最后爆炸了.)


Ala*_*Maw 5

这是不可能的.

IEnumerable API不可能告诉你它是否是无限的.您可以尝试将其转换为ICollection以捕获有人通过您其中之一的常见情况,但如果这是您想要的,那么为什么不首先采用ICollection <...>对象?