将IEnumerator转换为通用IEnumerator的最佳方法是什么?

zon*_*lut 31 c# ienumerator enumeration

我正在为C#.NET 3.5中的自定义ConfigurationHandler编写自定义ConfigurationElementCollection,并且我希望将IEnumerator公开为通用IEnumerator.

实现这一目标的最佳方法是什么?

我目前正在使用该代码:

public new IEnumerator<GenericObject> GetEnumerator()
{
  var list = new List();
  var baseEnum = base.GetEnumerator();
  while(baseEnum.MoveNext())
  {
    var obj = baseEnum.Current as GenericObject;
    if (obj != null)
      list.Add(obj);
  }
  return list.GetEnumerator();
}

干杯

Jon*_*eet 52

我不相信框架中有任何内容,但您可以轻松地编写一个:

IEnumerator<T> Cast<T>(IEnumerator iterator)
{
    while (iterator.MoveNext())
    {
        yield return (T) iterator.Current;
    }
}
Run Code Online (Sandbox Code Playgroud)

Enumerable.Cast<T>从LINQ 调用然后调用GetEnumerator()结果很诱人- 但是如果你的类已经实现IEnumerable<T>并且T是一个值类型,那么它就像一个no-op,所以GetEnumerator()调用recurses并抛出一个StackOverflowException.return foo.Cast<T>.GetEnumerator();foo它绝对是一个不同的对象(它不会委托给这个对象)时使用是安全的,但除此之外,你可能最好使用上面的代码.

  • 难道你不能从演员表中返回枚举器吗?return this.Cast <T>().GetEnumerator(); (7认同)
  • @flq,Jon:我正在做`this.Cast <T>().GetEnumerator()`解决方案,在同一场景中(虽然我是从`IEnumerable <T>`派生的),我得到了堆栈溢出. (2认同)