IEnumerator<T> Interfész

Definíció

Egyszerű iterációt támogat egy általános gyűjteményen keresztül.

generic <typename T>
public interface class IEnumerator : IDisposable, System::Collections::IEnumerator
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator where T : allows ref struct
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

Típusparaméterek

T

Az enumerálandó objektumok típusa.

Ez a típusparaméter kovariáns típusú. Ez azt jelenti, hogy a megadott típust vagy egy nagyobb mértékben származtatott bármilyen típust is használhat. A kovarianciáról és a kontravarianciáról a Kovariancia és a kontravariancia az általánosításban című cikket.
Származtatott
Megvalósítás

Példák

Az alábbi példa az IEnumerator<T> egyéni objektumok gyűjteményosztályának felületét mutatja be. Az egyéni objektum a típus Boxegy példánya, a gyűjteményosztály pedig az BoxCollection. Ez a kódpéldát egy nagyobb, az ICollection<T> interfészhez biztosított példa képezi.


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

Megjegyzések

IEnumerator<T> az összes általános enumerátor alapfelülete.

A C# nyelv foreach utasítása (For Each az Visual Basic) elrejti az enumerátorok összetettségét. Ezért az enumerátor közvetlen módosítása helyett ajánlott a használat foreach .

Az enumerátorok a gyűjtemény adatainak olvasására használhatók, de nem használhatók az alapul szolgáló gyűjtemény módosítására.

Kezdetben az enumerátor a gyűjtemény első eleme elé kerül. Ebben a pozícióban Current nincs meghatározva. Ezért a gyűjtemény értékének olvasása előtt meg kell hívnia MoveNext , hogy az enumerátort a gyűjtemény első elemére irányozza Currentelő.

Current ugyanazt az objektumot adja vissza, amíg a hívás meg nem MoveNext történik. MoveNext elemet a következő elemre állítja Current .

Ha MoveNext a gyűjtemény végére ér, az enumerátor a gyűjtemény utolsó eleme után lesz elhelyezve, és MoveNext visszaadja a függvényt false. Ha az enumerátor ebben a pozícióban van, a következő hívások is visszatérnek MoveNextfalse. Ha az utolsó visszaküldött MoveNextfalse hívás Current nincs meghatározva. A gyűjtemény első elemére nem lehet ismét beállítani Current ; ehelyett létre kell hoznia egy új enumerátorpéldányt.

Ez Reset a módszer a COM-együttműködésre szolgál. Nem feltétlenül kell implementálnunk; ehelyett a megvalósító egyszerűen dobja a NotSupportedException. Ha azonban ezt választja, győződjön meg arról, hogy egyetlen hívó sem támaszkodik a Reset funkcióra.

Ha módosításokat végez a gyűjteményen, például elemeket ad hozzá, módosít vagy töröl, az enumerátor viselkedése nincs meghatározva.

Az enumerátor nem rendelkezik kizárólagos hozzáféréssel a gyűjteményhez; ezért a gyűjteményen keresztüli számbavétel alapvetően nem szálbiztos eljárás. Az enumerálás során a szálbiztonság érdekében zárolhatja a gyűjteményt a teljes enumerálás során. Ahhoz, hogy a gyűjtemény több szálon keresztül is elérhető legyen olvasáshoz és íráshoz, saját szinkronizálást kell implementálnia.

A rendszer nem szinkronizálja a System.Collections.Generic névtérben lévő gyűjtemények alapértelmezett implementációit.

Megjegyzések az implementálókhoz

Ennek az interfésznek a implementálásához a nemgenerikus IEnumerator felület implementálása szükséges. A MoveNext() metódusok és Reset() a metódusok nem függnek, Tés csak a nemgenerikus felületen jelennek meg. A Current tulajdonság mindkét felületen megjelenik, és különböző visszatérési típusokkal rendelkezik. A nemgenerikus Current tulajdonság implementálása explicit felületi implementációként. Így a nemgenerikus felület bármely felhasználója felhasználhatja az általános felületet.

Emellett implementál isIEnumerator<T>, IDisposable ami megköveteli a metódus implementálásátDispose(). Ez lehetővé teszi az adatbázis-kapcsolatok bezárását, a fájlleírók vagy hasonló műveletek feloldását más erőforrások használatakor. Ha nincs további elidegenítendő erőforrás, adjon meg egy üres Dispose() megvalósítást.

Tulajdonságok

Name Description
Current

Lekéri a gyűjtemény elemét az enumerátor aktuális pozíciójában.

Metódusok

Name Description
Dispose()

Végrehajtja a nem felügyelt erőforrások felszabadításával, felszabadításával vagy alaphelyzetbe állításával kapcsolatos alkalmazásalapú feladatokat.

(Öröklődés forrása IDisposable)
MoveNext()

Az enumerátor tovább lép a gyűjtemény következő elemére.

(Öröklődés forrása IEnumerator)
Reset()

Az enumerátort a kezdeti pozíciójára állítja, amely a gyűjtemény első eleme előtt van.

(Öröklődés forrása IEnumerator)

A következőre érvényes:

Lásd még