实现Enumerator.GetNext()扩展方法

时间:2014-03-13 10:51:50

标签: c# extension-methods ienumerable

我想实现一个通用IEnumerator<T>扩展方法,该方法返回IEnumerable中的下一个元素,如下所示:

var list = new List<MyClass>();
var enumerator = list.GetEnumerator();

var nextItem1 = enumerator.GetNext();
var nextItem2 = enumerator.GetNext();

// Instead of calling enumerator.MoveNext() and then reading the current item.

我试图这样做,但它不会编译:

public static T GetNext(this IEnumerator<T> list)
{
     list.MoveNext();
     return list.Current;
}

我哪里出错了?感谢。

1 个答案:

答案 0 :(得分:3)

您似乎缺少方法签名上的泛型类型定义:

public static T GetNext<T>(this IEnumerator<T> list)
{
    // ---- this bit---^^^
}

假设没有具有相同名称的类级泛型类型,它需要在那里。否则它看起来很好。

然而...

我个人不会这样做,因为你没有听MoveNext的结果。除非您可以对预期值进行假设,否则无法判断迭代器是否到达集合的末尾。对于大多数常见用途,这不是一种可行的方法。

我实际上走了另一条路线并实施了一个只需手动迭代的AsEnumerable扩展方法,但是从外部允许你执行foreach (var item in iterator.AsEnumerable())这样的操作并且不会忽略MoveNext结果:

public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerator<TSource> iterator)
{
    while (iterator.MoveNext())
    {
        yield return iterator.Current;
    }
}