2016-06-20 11 views
0

ich eine Iterator-Schnittstelle in C# ich schreibe, die das gleiche wie ein IEnumerator verhält sich aber das hat es aus dem IEnumerator Verhalten eine andere Signaturumkehren das Verhalten von `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(); 
} 

, die rückwärts von MoveNext ist und Current. Wenn ich eine Implementierung, die einfach ein IEnumerator hüllt wie mein 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; 
    } 
} 

, aber es funktioniert nicht im Fall eines leeren enumerator weil hasNext wird true zurück, wenn es wirklich falsch ist, und ich weiß nicht, wie um zu überprüfen, ob der Enumerator leer ist, ohne den Enumerator zu mutieren. Wie kann ich?

+0

Der erste Aufruf von MoveNext wird Ihnen sagen, ob es irgendwelche Elemente gibt. Ohne dass Sie nichts sagen können –

+1

Beachten Sie auch, dass, obwohl dies zu Studienzwecken nett ist, jede echte Klasse (a) den C# -Benennungsrichtlinien folgen sollte, die üblicherweise 'InitialCapitals' für die Funktion (' HasNext', 'Next()') und (b) sollte auch den Standard "IEnumerator" und "IEnumerator " implementieren. – CompuChip

+0

Was ist der Grund für IEnumerator anstelle von IEnumerator? –

Antwort

5

Ich kann nicht überprüfen, ob der Enumerator leer ist, ohne den Enumerator zu mutieren. Wie kann ich?

Sie können nicht.

Wie lösen Sie das Problem?

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; 
    } 
} 

Die Moral der Geschichte: fragen über die Lösung von Problemen, nicht darum, wie etwas unmöglich, was zu tun, dass Sie denken, Sie tun müssen, um das Problem zu lösen. Wahrscheinlichkeiten sind gut, dass Sie nicht wirklich dieses Ding tun müssen.