IEnumerator<T> Interfaccia

Definizione

Supporta una iterazione semplice in una raccolte generica.

generic <typename T>
public interface class IEnumerator : IDisposable, System::Collections::IEnumerator
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator
public interface IEnumerator<T> : IDisposable, System.Collections.IEnumerator
type IEnumerator<'T> = interface
    interface IEnumerator
    interface IDisposable
type IEnumerator<'T> = interface
    interface IDisposable
    interface IEnumerator
Public Interface IEnumerator(Of Out T)
Implements IDisposable, IEnumerator
Public Interface IEnumerator(Of T)
Implements IDisposable, IEnumerator

Parametri di tipo

T

Tipo degli oggetti da enumerare.

Questo parametro di tipo è covariante, ovvero puoi usare il tipo specificato o qualsiasi tipo più derivato. Per altre informazioni sulla covarianza e la controvarianza, vedi Covarianza e controvarianza nei generics.
Derivato
Implementazioni

Esempio

Nell'esempio seguente viene illustrata un'implementazione dell'interfaccia IEnumerator<T> per una classe di raccolte di oggetti personalizzati. L'oggetto personalizzato è un'istanza del tipo Boxe la classe di raccolta è BoxCollection. Questo esempio di codice fa parte di un esempio più grande fornito per l'interfaccia ICollection<T> .


// Defines the enumerator for the Boxes collection.
// (Some prefer this class nested in the collection class.)
public class BoxEnumerator : IEnumerator<Box>
{
    private BoxCollection _collection;
    private int curIndex;
    private Box curBox;

    public BoxEnumerator(BoxCollection collection)
    {
        _collection = collection;
        curIndex = -1;
        curBox = default(Box);
    }

    public bool MoveNext()
    {
        //Avoids going beyond the end of the collection.
        if (++curIndex >= _collection.Count)
        {
            return false;
        }
        else
        {
            // Set current box to next item in collection.
            curBox = _collection[curIndex];
        }
        return true;
    }

    public void Reset() { curIndex = -1; }

    void IDisposable.Dispose() { }

    public Box Current
    {
        get { return curBox; }
    }

    object IEnumerator.Current
    {
        get { return Current; }
    }
}
' Defines the enumerator for the Boxes collection.
' (Some prefer this class nested in the collection class.)
Public Class BoxEnumerator
    Implements IEnumerator(Of Box)
    Private _collection As BoxCollection
    Private curIndex As Integer
    Private curBox As Box


    Public Sub New(ByVal collection As BoxCollection)
        MyBase.New()
        _collection = collection
        curIndex = -1
        curBox = Nothing

    End Sub

    Private Property Box As Box
    Public Function MoveNext() As Boolean _
        Implements IEnumerator(Of Box).MoveNext
        curIndex = curIndex + 1
        If curIndex = _collection.Count Then
            ' Avoids going beyond the end of the collection.
            Return False
        Else
            'Set current box to next item in collection.
            curBox = _collection(curIndex)
        End If
        Return True
    End Function

    Public Sub Reset() _
        Implements IEnumerator(Of Box).Reset
        curIndex = -1
    End Sub

    Public Sub Dispose() _
        Implements IEnumerator(Of Box).Dispose

    End Sub

    Public ReadOnly Property Current() As Box _
        Implements IEnumerator(Of Box).Current

        Get
            If curBox Is Nothing Then
                Throw New InvalidOperationException()
            End If

            Return curBox
        End Get
    End Property

    Private ReadOnly Property Current1() As Object _
        Implements IEnumerator.Current

        Get
            Return Me.Current
        End Get
    End Property
End Class

' Defines two boxes as equal if they have the same dimensions.
Public Class BoxSameDimensions
    Inherits EqualityComparer(Of Box)

    Public Overrides Function Equals(ByVal b1 As Box, ByVal b2 As Box) As Boolean
        If b1.Height = b2.Height And b1.Length = b2.Length And b1.Width = b2.Width Then
            Return True
        Else
            Return False
        End If
    End Function

    Public Overrides Function GetHashCode(ByVal bx As Box) As Integer
        Dim hCode As Integer = bx.Height ^ bx.Length ^ bx.Width
        Return hCode.GetHashCode()
    End Function
End Class

Commenti

IEnumerator<T> è l'interfaccia di base per tutti gli enumeratori generici.

L'istruzione foreach del linguaggio C# (for each in C++, For Each in Visual Basic) nasconde la complessità degli enumeratori. Pertanto, si consiglia l'utilizzo di foreach, anziché la modifica diretta dell'enumeratore.

È possibile utilizzare enumeratori per leggere i dati nella raccolta, ma non per modificare la raccolta sottostante.

Inizialmente l'enumeratore è posizionato davanti al primo elemento della raccolta. In questa posizione, la proprietà Current è indefinita. Pertanto, è necessario chiamare il metodo MoveNext per spostare in avanti l'enumeratore, in corrispondenza del primo elemento della raccolta, prima di leggere il valore di Current.

La proprietà Current restituisce lo stesso oggetto finché non viene chiamato il metodo MoveNext. MoveNext imposta Current sull'elemento successivo.

Se MoveNext passa la fine della raccolta, l'enumeratore viene posizionato dopo l'ultimo elemento della raccolta e MoveNext restituisce false. Quando l'enumeratore si trova in questa posizione, anche le chiamate successive per MoveNext restituire false. Se l'ultima chiamata a MoveNext restituisce false, Current non è definita. Non è possibile impostare nuovamente la proprietà Current sul primo elemento della raccolta; è necessario creare una nuova istanza di enumeratore.

Il Reset metodo viene fornito per l'interoperabilità COM. Non deve necessariamente essere implementata; In alternativa, l'implementatore può semplicemente generare un'eccezione NotSupportedException. Tuttavia, se si sceglie di eseguire questa operazione, è necessario assicurarsi che nessun chiamante si basi sulla Reset funzionalità.

Se vengono apportate modifiche alla raccolta, ad esempio l'aggiunta, la modifica o l'eliminazione di elementi, il comportamento dell'enumeratore non è definito.

L'enumeratore non dispone di accesso esclusivo alla raccolta. L'enumerazione di una raccolta non è quindi una procedura thread-safe. Per assicurare la protezione del thread durante l'enumerazione, è possibile bloccare la raccolta durante l'intera enumerazione. Per consentire l'accesso alla raccolta in lettura e scrittura da parte di più thread, è necessario implementare la propria sincronizzazione.

Le implementazioni predefinite di raccolte nello spazio dei nomi System.Collections.Generic non sono sincronizzate.

Note per gli implementatori

L'implementazione di questa interfaccia richiede l'implementazione dell'interfaccia nongenerica IEnumerator . I MoveNext() metodi e Reset() non dipendono da Te vengono visualizzati solo sull'interfaccia nongenerica. La Current proprietà viene visualizzata in entrambe le interfacce e include tipi restituiti diversi. Implementare la proprietà nongenerica Current come implementazione esplicita dell'interfaccia. Ciò consente a qualsiasi consumer dell'interfaccia nongenerica di usare l'interfaccia generica.

Inoltre, IEnumerator<T> implementa IDisposable, che richiede di implementare il Dispose() metodo. Ciò consente di chiudere connessioni alle banche dati o rilasciare handle di file o operazioni simili quando si usano altre risorse. Se non sono presenti risorse aggiuntive da eliminare, fornire un'implementazione vuota Dispose() .

Proprietà

Current

Ottiene l'elemento della raccolta in corrispondenza della posizione corrente dell'enumeratore.

Metodi

Dispose()

Esegue attività definite dall'applicazione, come rilasciare o reimpostare risorse non gestite.

(Ereditato da IDisposable)
MoveNext()

Sposta l'enumeratore all'elemento successivo della raccolta.

(Ereditato da IEnumerator)
Reset()

Imposta l'enumeratore sulla propria posizione iniziale, ovvero prima del primo elemento nella raccolta.

(Ereditato da IEnumerator)

Si applica a

Vedi anche