我在C#中编写一个Iterator接口,其行为与a相同,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();
}
Run Code Online (Sandbox Code Playgroud)
这是向后从IEnumerator行为MoveNext和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;
}
}
Run Code Online (Sandbox Code Playgroud)
但它在空枚举器的情况下不起作用,因为hasNext当它真的是假的时候会返回true而我不知道如何在不改变枚举器的情况下检查枚举器是否为空.我怎么能够?
我不知道如何在不改变枚举器的情况下检查枚举器是否为空.我怎么能够?
你不能.
那么你如何解决这个问题呢?
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;
}
}
Run Code Online (Sandbox Code Playgroud)
故事的寓意:询问解决问题,而不是如何做一些你认为需要做的不可能的事情来解决问题.你实际上并不需要做那件事的可能性很大.
| 归档时间: |
|
| 查看次数: |
352 次 |
| 最近记录: |