IEnumerator<T> Rozhraní

Definice

Podporuje jednoduchou iteraci v obecné kolekci.

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

Parametry typu

T

Typ objektů, které se mají vypsat.

Tento parametr typu je kovariantní. To znamená, že můžete použít buď zadaný typ, nebo libovolný typ, který je více odvozený. Další informace o kovarianci a kontravarianci najdete v tématu popisujícím kovarianci a kontravarianci u parametrického polymorfismu.
Odvozené
Implementuje

Příklady

Následující příklad ukazuje implementaci IEnumerator<T> rozhraní pro kolekci třídy vlastních objektů. Vlastní objekt je instance typu Boxa třída kolekce je BoxCollection. Tento příklad kódu je součástí většího příkladu ICollection<T> pro rozhraní.


// 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

Poznámky

IEnumerator<T> je základní rozhraní pro všechny obecné enumerátory.

Příkaz foreach jazyka C# (for each v jazyce C++, For Each v jazyce Visual Basic) skrývá složitost enumerátorů. Proto se doporučuje použít foreach místo přímé manipulace s enumerátorem.

Enumerátory lze používat ke čtení dat v kolekci, nikoli však k úpravě zdrojové kolekce.

Zpočátku je enumerátor umístěn před prvním prvkem v kolekci. Na této pozici Current není definován. Proto je nutné před čtením hodnoty CurrentvolatMoveNext, aby se enumerátor přepojí na první prvek kolekce.

Current vrátí stejný objekt, dokud MoveNext není volána. MoveNext nastaví Current na další prvek.

Pokud MoveNext přejde na konec kolekce, enumerátor se umístí za poslední prvek v kolekci a MoveNext vrátí false. Pokud je enumerátor na této pozici, další volání MoveNext vrátí falsetaké . Pokud je poslední volání MoveNext vráceno false, Current není definováno. Nelze znovu nastavit Current na první prvek kolekce; místo toho musíte vytvořit novou instanci enumerátoru.

Metoda Reset je k dispozici pro interoperabilitu modelu COM. Nemusí se nutně provádět; místo toho může implementátor jednoduše vyvolat NotSupportedException. Pokud se k tomu ale rozhodnete, měli byste se ujistit, že na tuto funkci nespoléhají Reset žádní volající.

Pokud jsou v kolekci provedeny změny, například přidání, úprava nebo odstranění prvků, chování enumerátoru není definováno.

Enumerátor nemá výhradní přístup ke kolekci. proto výčet prostřednictvím kolekce není vnitřně procedurou bezpečnou pro přístup z více vláken. Abyste zajistili bezpečnost vláken během výčtu, můžete kolekci zamknout během celého výčtu. Chcete-li více vláknům umožnit přístup ke kolekci pro čtení a zápis, musíte implementovat svou vlastní synchronizaci.

Výchozí implementace kolekcí v System.Collections.Generic oboru názvů se nesynchronují.

Poznámky pro implementátory

Implementace tohoto rozhraní vyžaduje implementaci rozhraní, které není obecné IEnumerator . Metody MoveNext() a Reset() nezávisí na Ta zobrazují se pouze na rozhraní, které není obecné. Vlastnost Current se zobrazuje v obou rozhraních a má různé návratové typy. Implementujte negenerickou Current vlastnost jako explicitní implementaci rozhraní. To umožňuje každému příjemci negenerického rozhraní využívat obecné rozhraní.

Kromě toho IEnumerator<T> implementuje IDisposable, což vyžaduje implementaci Dispose() metody . Díky tomu můžete při použití jiných prostředků ukončit připojení k databázi, uvolnit popisovače souborů nebo podobné operace. Pokud nejsou k dispozici žádné další prostředky k odstranění, poskytněte prázdnou Dispose() implementaci.

Vlastnosti

Current

Získá prvek v kolekci na aktuální pozici enumerátoru.

Metody

Dispose()

Provede aplikací definované úlohy spojené s uvolněním nebo resetováním nespravovaných prostředků.

(Zděděno od IDisposable)
MoveNext()

Posune enumerátor na další prvek kolekce.

(Zděděno od IEnumerator)
Reset()

Nastaví enumerátor na jeho počáteční pozici, která je před prvním prvkem v kolekci.

(Zděděno od IEnumerator)

Platí pro

Viz také