IEnumerator<T> Gränssnitt

Definition

Stöder en enkel iteration över en allmän samling.

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

Typparametrar

T

Vilken typ av objekt som ska räknas upp.

Det här är en covariant-typparameter. Det innebär att du kan använda antingen den typ du angett eller en typ som är mer härledd. Mer information om kovarians och kontravarians finns i Kovarians och kontravarians i Generisk typ.
Härledda
Implementeringar

Exempel

I följande exempel visas en implementering av IEnumerator<T> gränssnittet för en samlingsklass med anpassade objekt. Det anpassade objektet är en instans av typen Boxoch samlingsklassen är BoxCollection. Det här kodexemplet är en del av ett större exempel som tillhandahålls för ICollection<T> gränssnittet.


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

Kommentarer

IEnumerator<T> är basgränssnittet för alla generiska uppräknare.

foreach-instruktionen för C#-språket (For Each i Visual Basic) döljer uppräknarens komplexitet. Därför rekommenderas användning foreach i stället för att direkt manipulera uppräknaren.

Uppräknare kan användas för att läsa data i samlingen, men de kan inte användas för att ändra den underliggande samlingen.

Inledningsvis placeras uppräknaren före det första elementet i samlingen. I det här läget Current är det odefinierat. Därför måste du anropa MoveNext för att flytta uppräknaren till det första elementet i samlingen innan du läser värdet Currentför .

Current returnerar samma objekt tills det anropas MoveNext . MoveNext anger Current till nästa element.

Om MoveNext skickar slutet av samlingen placeras uppräknaren efter det sista elementet i samlingen och MoveNext returnerar false. När uppräknaren befinner sig på den här positionen returnerar falseefterföljande anrop MoveNext även . Om det sista anropet som MoveNext returnerades Currentfalseär odefinierat. Du kan inte ange Current det första elementet i samlingen igen. Du måste skapa en ny uppräkningsinstans i stället.

Metoden Reset tillhandahålls för COM-samverkan. Det behöver inte nödvändigtvis genomföras. i stället kan implementeraren helt enkelt kasta en NotSupportedException. Men om du väljer att göra detta bör du se till att inga anropare förlitar sig på Reset funktionerna.

Om ändringar görs i samlingen, till exempel att lägga till, ändra eller ta bort element, är uppräknarens beteende odefinierat.

Uppräknaren har inte exklusiv åtkomst till samlingen. Därför är uppräkning genom en samling i sig inte en trådsäker procedur. För att garantera trådsäkerheten under uppräkningen kan du låsa samlingen under hela uppräkningen. Om du vill att samlingen ska kunna nås av flera trådar för läsning och skrivning måste du implementera din egen synkronisering.

Standardimplementeringar av samlingar i System.Collections.Generic namnområdet synkroniseras inte.

Anteckningar till implementerare

Implementering av det här gränssnittet kräver implementering av det icke-generiska IEnumerator gränssnittet. Metoderna MoveNext() och Reset() är inte beroende Tav och visas endast i det icke-generiska gränssnittet. Egenskapen Current visas i båda gränssnitten och har olika returtyper. Implementera den icke-generiska Current egenskapen som en explicit gränssnittsimplementering. Detta gör att alla användare av det icke-generiska gränssnittet kan använda det generiska gränssnittet.

Dessutom IEnumerator<T> implementerar , som kräver att du implementerar IDisposableDispose() metoden. På så sätt kan du stänga databasanslutningar eller versionsfilhandtag eller liknande åtgärder när du använder andra resurser. Om det inte finns några ytterligare resurser att ta bort anger du en tom Dispose() implementering.

Egenskaper

Name Description
Current

Hämtar elementet i samlingen på den aktuella positionen för uppräknaren.

Metoder

Name Description
Dispose()

Utför programdefinierade uppgifter som är associerade med att frigöra, frigöra eller återställa ohanterade resurser.

(Ärvd från IDisposable)
MoveNext()

Avancerar uppräknaren till nästa element i samlingen.

(Ärvd från IEnumerator)
Reset()

Anger uppräknaren till sin ursprungliga position, som är före det första elementet i samlingen.

(Ärvd från IEnumerator)

Gäller för

Se även