我如何使用IEnumerator.Reset()?

Meh*_*dad 34 .net c# ienumerator

如何正确地打电话IEnumerator.Reset

文件说:

Reset方法用于COM互操作性.它不一定需要实施; 相反,实施者可以简单地抛出一个NotSupportedException.

好的,这也就是说我不应该打电话给它吗?

它是如此诱人的使用流量控制例外:

using (enumerator = GetSomeExpensiveEnumerator())
{
    while (enumerator.MoveNext()) { ... }

    try { enumerator.Reset(); } //Try an inexpensive method
    catch (NotSupportedException)
    { enumerator = GetSomeExpensiveEnumerator(); } //Fine, get another one

    while (enumerator.MoveNext()) { ... }
}
Run Code Online (Sandbox Code Playgroud)

这是我们应该如何使用它?或者我们不打算从托管代码中使用它?

Mar*_*ell 50

从未 ; 最终这是一个错误.不止一次迭代序列的正确方法是.GetEnumerator()再次调用- 即foreach再次使用.如果您的数据不可重复(或重复费用昂贵),请通过.ToList()或类似地缓冲它.

迭代器块为此方法抛出异常是语言规范中的正式要求.因此,你不能依赖它的工作.永远.

  • @Mark Gravell:并非所有枚举器都是迭代器块。如果您使用的是已知的 IEnumerator 实现,其 Reset 方法已知可以工作,则可以依靠 Reset 工作。例如,System.Collections.Generic.List<T>。 (2认同)
  • @phoog是明确记录的工作......?然后你把自己限制在`List <T>`,而不是界面 - 这有点痛苦.如果你已经知道你有T列表,那么你也知道迭代它就好了...... (2认同)

Ste*_*ary 8

我建议不要使用它.许多现代IEnumerable实现只会抛出异常.

获得调查员几乎不"昂贵".它全部(完全)枚举它们可能很昂贵.

  • @Mehrdad:在这种情况下,定义枚举器,使其仅在枚举第一项时调用“FindFirstFile”。这样,它就像所有其他枚举器一样。 (2认同)