Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 是否存在任何不可重复的IEnumerable类?_.net_Ienumerable - Fatal编程技术网

.net 是否存在任何不可重复的IEnumerable类?

.net 是否存在任何不可重复的IEnumerable类?,.net,ienumerable,.net,Ienumerable,是否存在任何不可重复的IEnumerable类 “不可重复”是指不能多次安全地调用GetEnumerator,或者调用GetEnumerator会产生明显的副作用。否,任何实现IEnumerable的行为良好的类都允许重复枚举 要枚举不可重复的集合,您没有实现IEnumerable的类。相反,您有一个返回枚举数的方法。这样,枚举器而不是类保存集合,因此不可能对同一集合调用两次GetEnumerator。要重复枚举数,必须调用该方法以创建新集合 这方面的一个例子是枚举.Range方法。它动态地为一

是否存在任何不可重复的IEnumerable类


“不可重复”是指不能多次安全地调用GetEnumerator,或者调用GetEnumerator会产生明显的副作用。

否,任何实现
IEnumerable
的行为良好的类都允许重复枚举

要枚举不可重复的集合,您没有实现
IEnumerable
的类。相反,您有一个返回枚举数的方法。这样,枚举器而不是类保存集合,因此不可能对同一集合调用两次
GetEnumerator
。要重复枚举数,必须调用该方法以创建新集合


这方面的一个例子是
枚举.Range
方法。它动态地为一个范围创建项目,因此该范围不作为集合存在,这使得它不可重复。若要再次枚举相同的范围,请调用该方法以创建具有相同边界的新范围。

IEnumerable(of T)的实现可以出于任何原因返回它们认为合适的任何项。很好的预期是,如果一个人对相同的项序列调用两次GetEnumerator,然后在两个枚举器之间循环,那么他们要么以相同的顺序生成相同的项,要么抛出异常。有许多例程接受IEnumerable(of T),如果给定的例程不遵守这样的约定,则会严重失败


如果我有我的druthers,IEnumerable会被分成一系列接口;基本IEnumerable的枚举器将丢失重置方法,并且不会传递可重复性的特定承诺。一个新的IMultiEnumerable将返回一个带有重置方法的枚举数,并保证多次传递将产生相同的数据;枚举器还可能支持自己的GetEnumerator方法(我认为这对于任何支持多过程枚举的类型都是可行的;唯一的代价是一个“开始”指针,这样嵌套的枚举器将重置为其原始创建的位置)。

File.ReadLines()
是否返回只工作一次的
IEnumerable

不可重复是什么意思?根据这两个答案,你的问题是不明确的。枚举数不一定是可重复的。如果您的枚举数包装了一个流,那么您就不必对它调用Reset。但是在一个级别上,您通常可以调用GetEnumerator任意多次,并且总是得到相同的结果。但是您总是可以这样调用GetEnumerator吗?Enumerable.Range根本不创建项,这由Enumerable.Range.GetEnumerator负责。因为它返回的枚举数每次都有相同的初始值,所以它仍然被认为是可重复的。@Jonathan:你没有抓住要点。该范围不可重复,因为无法再次枚举相同的范围,必须创建新的范围。由于Range方法返回的不是可枚举对象,而是枚举数,因此没有对象可以调用GetEnumerator来重复枚举。为什么要进行向下投票?如果你不解释你认为答案有什么问题,它就无法改善它。为什么要投否决票?如果你不解释你认为答案有什么问题,它就无法改善它。好吧,这是一个令人不快的惊喜。我不确定这是出于设计还是库中的错误。它不会抛出正常的
InvalidOperationException
,但会将访问已处理的文本读取器时产生的错误传递给调用方,这提示它可能确实是一个错误。这可能是.NET 4.0中的一个错误(或功能)。我无法用.NET4.5复制它。