Bagikan melalui


IEnumerator<T> Antarmuka

Definisi

Mendukung iterasi sederhana melalui koleksi generik.

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

Jenis parameter

T

Jenis objek yang akan dijumlahkan.

Parameter jenis ini bersifat kovarian. Artinya, Anda bisa menggunakan jenis yang Anda tentukan atau jenis apa pun yang lebih banyak diturunkan. Untuk informasi lebih lanjut tentang kovariansi dan kontravariansi, lihat Kovariansi dan Kontravariansi dalam Generik.
Turunan
Penerapan

Contoh

Contoh berikut menunjukkan implementasi antarmuka IEnumerator<T> untuk kelas koleksi objek kustom. Objek kustom adalah instans jenis Box, dan kelas koleksi BoxCollection. Contoh kode ini adalah bagian dari contoh yang lebih besar yang disediakan untuk antarmuka 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

Keterangan

IEnumerator<T> adalah antarmuka dasar untuk semua enumerator generik.

Pernyataan foreach bahasa C# (for each di C++, For Each di Visual Basic) menyembunyikan kompleksitas enumerator. Oleh karena itu, menggunakan foreach disarankan, alih-alih langsung memanipulasi enumerator.

Enumerator dapat digunakan untuk membaca data dalam koleksi, tetapi tidak dapat digunakan untuk memodifikasi koleksi yang mendasar.

Awalnya, enumerator diposisikan sebelum elemen pertama dalam koleksi. Pada posisi ini, Current tidak terdefinisi. Oleh karena itu, Anda harus memanggil MoveNext untuk memajukan enumerator ke elemen pertama koleksi sebelum membaca nilai Current.

Current mengembalikan objek yang sama hingga MoveNext dipanggil. MoveNext mengatur Current ke elemen berikutnya.

Jika MoveNext melewati akhir koleksi, enumerator diposisikan setelah elemen terakhir dalam koleksi dan MoveNext mengembalikan false. Ketika enumerator berada di posisi ini, panggilan berikutnya ke MoveNext juga mengembalikan false. Jika panggilan terakhir ke MoveNext dikembalikan false, Current tidak ditentukan. Anda tidak dapat mengatur Current ke elemen pertama koleksi lagi; Anda harus membuat instans enumerator baru sebagai gantinya.

Metode Reset disediakan untuk interoperabilitas COM. Itu tidak selalu perlu diimplementasikan; sebaliknya, pelaksana hanya dapat melemparkan NotSupportedException. Namun, jika Anda memilih untuk melakukan ini, Anda harus memastikan tidak ada penelepon yang mengandalkan fungsionalitas Reset.

Jika perubahan dilakukan pada koleksi, seperti menambahkan, memodifikasi, atau menghapus elemen, perilaku enumerator tidak ditentukan.

Enumerator tidak memiliki akses eksklusif ke koleksi; oleh karena itu, menghitung melalui koleksi secara intrinsik bukan prosedur aman utas. Untuk menjamin keamanan utas selama enumerasi, Anda dapat mengunci koleksi selama seluruh enumerasi. Untuk memungkinkan koleksi diakses oleh beberapa utas untuk membaca dan menulis, Anda harus menerapkan sinkronisasi Anda sendiri.

Implementasi default koleksi di namespace System.Collections.Generic tidak disinkronkan.

Catatan Bagi Implementer

Menerapkan antarmuka ini memerlukan penerapan antarmuka IEnumerator nongenerik. Metode MoveNext() dan Reset() tidak bergantung pada T, dan hanya muncul pada antarmuka nongenerik. Properti Current muncul di kedua antarmuka, dan memiliki jenis pengembalian yang berbeda. Terapkan properti Current nongenerik sebagai implementasi antarmuka eksplisit. Ini memungkinkan setiap konsumen antarmuka nongenerik untuk mengonsumsi antarmuka generik.

Selain itu, IEnumerator<T> mengimplementasikan IDisposable, yang mengharuskan Anda untuk menerapkan metode Dispose(). Ini memungkinkan Anda menutup koneksi database atau melepaskan handel file atau operasi serupa saat menggunakan sumber daya lain. Jika tidak ada sumber daya tambahan untuk dibuang, berikan implementasi Dispose() kosong.

Properti

Current

Mendapatkan elemen dalam koleksi pada posisi enumerator saat ini.

Metode

Dispose()

Melakukan tugas yang ditentukan aplikasi yang terkait dengan membebaskan, merilis, atau mengatur ulang sumber daya yang tidak dikelola.

(Diperoleh dari IDisposable)
MoveNext()

Memajukan enumerator ke elemen koleksi berikutnya.

(Diperoleh dari IEnumerator)
Reset()

Mengatur enumerator ke posisi awalnya, yaitu sebelum elemen pertama dalam koleksi.

(Diperoleh dari IEnumerator)

Berlaku untuk

Lihat juga