【发布时间】:2016-06-20 23:12:06
【问题描述】:
我正在用 C# 编写一个迭代器接口,它的行为与 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();
}
这与MoveNext 和Current 的IEnumerator 行为相反。如果我有一个简单地将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;
}
}
但在枚举数为空的情况下不起作用,因为hasNext 将在它真的为假时返回真,而且我不知道如何在不改变枚举数的情况下检查枚举数是否为空。我该怎么办?
【问题讨论】:
-
第一次调用 MoveNext 会告诉您是否有任何项目。没有你什么都不能说
-
另请注意,尽管这对学习来说很好,但任何真正的类都应该 (a) 遵循 C# 命名准则,其中通常包括
InitialCapitals用于函数(HasNext,Next())和( b) 还应执行标准IEnumerator和IEnumerator<T>。 -
IEnumerator
-
@CompuChimp,camelCase 是项目的命名约定,所以我坚持使用它。
-
@SirRufo 无。我会在项目中更新它。