实现Enumerator.GetNext()扩展方法

本文关键字:扩展 方法 Enumerator GetNext 实现 | 更新日期: 2023-09-27 17:49:52

我想实现一个通用的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;
}

我哪里做错了?谢谢。

实现Enumerator.GetNext()扩展方法

您似乎错过了方法签名上的泛型类型定义:

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;
    }
}