我想实现一个通用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;
}
我哪里出错了?感谢。
答案 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;
}
}