首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现Enumerator.GetNext()扩展方法

实现Enumerator.GetNext()扩展方法
EN

Stack Overflow用户
提问于 2014-03-13 10:51:49
回答 1查看 1.4K关注 0票数 1

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

代码语言:javascript
复制
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.

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

代码语言:javascript
复制
public static T GetNext(this IEnumerator<T> list)
{
     list.MoveNext();
     return list.Current;
}

我哪里出错了?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-13 10:52:40

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

代码语言:javascript
复制
public static T GetNext<T>(this IEnumerator<T> list)
{
    // ---- this bit---^^^
}

如果没有具有相同名称的类级泛型类型,则需要存在该类型。否则就没问题了。

然而..。

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

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

代码语言:javascript
复制
public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerator<TSource> iterator)
{
    while (iterator.MoveNext())
    {
        yield return iterator.Current;
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22376275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档