IEnumerator是否有“HasNext”方法?

使用Java Iterator ,我使用hasNext方法来确定迭代是否有更多元素(不消耗元素) – 因此, hasNext就像一个“ Peek ”方法。

我的问题:C#的通用IEnumerator是否有类似“ hasNext ”或“ Peek ”的方法?

不,不幸的是没有。

IEnumerator接口仅公开以下成员:

方法:

Dispose
MoveNext
Reset

属性

Current

不,但在C#中你可以反复询问当前元素而不必移动到下一个元素。 这只是一种不同的看待方式。

编写一个C#类来获取.NET风格的IEnumerator并返回一个Java风格的Iterator并不难。 我个人认为在大多数情况下.NET样式更容易使用,但我们去:)

编辑:好的,这是完全未经测试的,但我认为它会起作用。 它至少编译:)

 using System; using System.Collections; using System.Collections.Generic; // // Mimics Java's Iterable interface public interface IIterable { IIterator Iterator(); } // Mimics Java's Iterator interface - but // implements IDisposable for the sake of // parity with IEnumerator. public interface IIterator : IDisposable { bool HasNext { get; } T Next(); void Remove(); } public sealed class EnumerableAdapter : IIterable { private readonly IEnumerable enumerable; public EnumerableAdapter(IEnumerable enumerable) { this.enumerable = enumerable; } public IIterator Iterator() { return new EnumeratorAdapter(enumerable.GetEnumerator()); } } public sealed class EnumeratorAdapter : IIterator { private readonly IEnumerator enumerator; private bool fetchedNext = false; private bool nextAvailable = false; private T next; public EnumeratorAdapter(IEnumerator enumerator) { this.enumerator = enumerator; } public bool HasNext { get { CheckNext(); return nextAvailable; } } public T Next() { CheckNext(); if (!nextAvailable) { throw new InvalidOperationException(); } fetchedNext = false; // We've consumed this now return next; } void CheckNext() { if (!fetchedNext) { nextAvailable = enumerator.MoveNext(); if (nextAvailable) { next = enumerator.Current; } fetchedNext = true; } } public void Remove() { throw new NotSupportedException(); } public void Dispose() { enumerator.Dispose(); } } public sealed class IterableAdapter : IEnumerable { private readonly IIterable iterable; public IterableAdapter(IIterable iterable) { this.iterable = iterable; } public IEnumerator GetEnumerator() { return new IteratorAdapter(iterable.Iterator()); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public sealed class IteratorAdapter : IEnumerator { private readonly IIterator iterator; private bool gotCurrent = false; private T current; public IteratorAdapter(IIterator iterator) { this.iterator = iterator; } public T Current { get { if (!gotCurrent) { throw new InvalidOperationException(); } return current; } } object IEnumerator.Current { get { return Current; } } public bool MoveNext() { gotCurrent = iterator.HasNext; if (gotCurrent) { current = iterator.Next(); } return gotCurrent; } public void Reset() { throw new NotSupportedException(); } public void Dispose() { iterator.Dispose(); } } 

调查员经常被懒惰地评估,因此HasNext没有多大意义。

不 ,只需MoveNextResetCurrent

您还可以尝试查看此实现窥视到IEnumerator和IEnumerator <> 。 这是一个将Peek功能添加到IEnumerator的扩展方法。 希望能帮助到你。 🙂