我在C#中编写一个Iterator接口,其行为与IEnumerator
相同,但它具有不同的签名
public interface Iterator
{
/// <summary>
/// Check if there iterator has another value.
/// </summary>
/// <returns><c>true</c>, if there is another value <c>false</c> otherwise.</returns>
bool hasNext();
/// <summary>
/// Move the iterator to the next object and return that object.
/// </summary>
/// <returns>The next object.</returns>
object next();
}
从IEnumerator
和MoveNext
的{{1}}行为向后退。如果我的实现只是将Current
包装为我的IEnumerator
Iterable
但它在空枚举器的情况下不起作用,因为class EnumeratorWrap: Iterator
{
private IEnumerator<object> _iter;
private bool _hasNext = true;
public Enumerator(IEnumerator<object> iter)
{
_iter = iter;
}
override public bool hasNext()
{
return _hasNext;
}
override public object next()
{
_hasNext = _iter.MoveNext();
return _iter.Current;
}
}
在真正为假时将返回true并且我不知道如何在不改变枚举器的情况下检查枚举数是否为空。我怎么能?
答案 0 :(得分:5)
我不知道如何在不改变枚举器的情况下检查枚举器是否为空。我怎么能?
你不能。
那么你如何解决这个问题?
class EnumeratorWrap: Iterator
{
private IEnumerator _iter;
private bool _hasNext;
private object _next;
public EnumeratorWrap(IEnumerator iter)
{
_iter = iter;
Next();
}
public bool HasNext()
{
return _hasNext;
}
public object Next()
{
object current = _next;
_hasNext = _iter.MoveNext();
_next = _hasNext ? _iter.Current : null;
return current;
}
}
故事的寓意:询问解决问题,而不是如何做一些你认为需要做的不可能的事情来解决问题。你实际上并不需要做那件事的可能性很大。