C# 反转“IEnumerator”的行为`
我正在用C#编写一个迭代器接口,它的行为与C# 反转“IEnumerator”的行为`,c#,iterator,C#,Iterator,我正在用C#编写一个迭代器接口,它的行为与IEnumerator相同,但它有一个不同的签名 public interface Iterator { /// <summary> /// Check if there iterator has another value. /// </summary> /// <returns><c>true</c>, if there is another value &l
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();
}
但它在空枚举数的情况下不起作用,因为hasNext
将在实际为false时返回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;
}
}
这个故事的寓意是:询问如何解决问题,而不是如何做一些你认为需要做的不可能的事情来解决问题。很可能你实际上不需要做那件事
我不知道如何在不改变枚举数的情况下检查枚举数是否为空。我该怎么办
你不能
那么你如何解决这个问题呢
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;
}
}
这个故事的寓意是:询问如何解决问题,而不是如何做一些你认为需要做的不可能的事情来解决问题。很有可能您实际上不需要这样做。第一次呼叫MoveNext会告诉您是否有任何项目。此外,请注意,尽管这对于学习来说很好,但任何真正的类都应该(a)遵循C#命名准则,其中通常包括函数(
HasNext
,Next()
)和(b)的InitialCapitals
)还应实现标准的IEnumerator
和IEnumerator
。为什么使用IEnumerator而不是IEnumerator?@CompuChimp,camelCase是项目的命名约定,所以我坚持使用。@SirRufo none。我将在项目中更新它。第一次调用MoveNext将告诉您是否有任何项目。此外,请注意,尽管这对于学习来说很好,但任何真正的类都应该(a)遵循C#命名准则,其中通常包括函数(HasNext
,Next()
)和(b)的InitialCapitals
)还应实现标准的IEnumerator
和IEnumerator
。为什么使用IEnumerator而不是IEnumerator?@CompuChimp,camelCase是项目的命名约定,所以我坚持使用。@SirRufo none。我会在项目中更新。