Udostępnij za pośrednictwem


Dictionary<TKey,TValue>.IDictionary.GetEnumerator Metoda

Definicja

Zwraca element IDictionaryEnumerator dla elementu IDictionary.

 virtual System::Collections::IDictionaryEnumerator ^ System.Collections.IDictionary.GetEnumerator() = System::Collections::IDictionary::GetEnumerator;
System.Collections.IDictionaryEnumerator IDictionary.GetEnumerator ();
abstract member System.Collections.IDictionary.GetEnumerator : unit -> System.Collections.IDictionaryEnumerator
override this.System.Collections.IDictionary.GetEnumerator : unit -> System.Collections.IDictionaryEnumerator
Function GetEnumerator () As IDictionaryEnumerator Implements IDictionary.GetEnumerator

Zwraca

Element IDictionaryEnumerator dla elementu IDictionary.

Implementuje

Przykłady

W poniższym przykładzie kodu pokazano, jak wyliczyć pary klucz/wartość w słowniku przy użyciu foreach instrukcji (For Each w języku Visual Basic for each w języku C++), która ukrywa użycie modułu wyliczającego. W szczególności należy pamiętać, że moduł wyliczający interfejs System.Collections.IDictionary zwraca DictionaryEntry obiekty, a nie KeyValuePair<TKey,TValue> obiekty.

Przykład kodu jest częścią większego przykładu, w tym danych wyjściowych podanych IDictionary.Add dla metody .

using System;
using System.Collections;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        // Create a new dictionary of strings, with string keys,
        // and access it using the IDictionary interface.
        //
        IDictionary openWith = new Dictionary<string, string>();

        // Add some elements to the dictionary. There are no
        // duplicate keys, but some of the values are duplicates.
        // IDictionary.Add throws an exception if incorrect types
        // are supplied for key or value.
        openWith.Add("txt", "notepad.exe");
        openWith.Add("bmp", "paint.exe");
        openWith.Add("dib", "paint.exe");
        openWith.Add("rtf", "wordpad.exe");
Imports System.Collections
Imports System.Collections.Generic

Public Class Example
    
    Public Shared Sub Main() 

        ' Create a new dictionary of strings, with string keys,
        ' and access it using the IDictionary interface.
        '
        Dim openWith As IDictionary = _
            New Dictionary(Of String, String)
        
        ' Add some elements to the dictionary. There are no 
        ' duplicate keys, but some of the values are duplicates.
        ' IDictionary.Add throws an exception if incorrect types
        ' are supplied for key or value.
        openWith.Add("txt", "notepad.exe")
        openWith.Add("bmp", "paint.exe")
        openWith.Add("dib", "paint.exe")
        openWith.Add("rtf", "wordpad.exe")
// When you use foreach to enumerate dictionary elements
// with the IDictionary interface, the elements are retrieved
// as DictionaryEntry objects instead of KeyValuePair objects.
Console.WriteLine();
foreach( DictionaryEntry de in openWith )
{
    Console.WriteLine("Key = {0}, Value = {1}",
        de.Key, de.Value);
}
' When you use foreach to enumerate dictionary elements
' with the IDictionary interface, the elements are retrieved
' as DictionaryEntry objects instead of KeyValuePair objects.
Console.WriteLine()
For Each de As DictionaryEntry In openWith
    Console.WriteLine("Key = {0}, Value = {1}", _
        de.Key, de.Value)
Next
    }
}

    End Sub

End Class

Uwagi

Na potrzeby wyliczenia każdy element jest strukturą DictionaryEntry .

Instrukcja foreach języka C# (for each w języku C++ For Each , w Visual Basic) ukrywa złożoność modułów wyliczania. W związku z tym użycie foreach jest zalecane, zamiast bezpośrednio manipulować modułem wyliczającym.

Moduły wyliczające mogą służyć do odczytu danych w kolekcji, ale nie można za ich pomocą modyfikować kolekcji źródłowej.

Początkowo moduł wyliczający jest umieszczony przed pierwszym elementem w kolekcji. Metoda Reset powoduje również powrót modułu wyliczającego do tej pozycji. Na tym stanowisku Entry jest niezdefiniowany. W związku z tym należy wywołać metodę MoveNext , aby przejść do pierwszego elementu kolekcji przed odczytaniem wartości Entry.

Właściwość Entry zwraca ten sam element do momentu wywołania MoveNext metody lub Reset . MoveNext ustawia Entry wartość na następny element.

Jeśli MoveNext przejdzie koniec kolekcji, moduł wyliczający jest umieszczony po ostatnim elemecie w kolekcji i MoveNext zwraca wartość false. Gdy moduł wyliczający znajduje się na tym stanowisku, kolejne wywołania, aby MoveNext również zwrócić falsewartość . Jeśli ostatnie wywołanie, które MoveNext ma być zwrócone false, Entry jest niezdefiniowane. Aby ponownie ustawić Entry element na pierwszy element kolekcji, możesz wywołać Reset metodę .MoveNext

Moduł wyliczający zachowuje ważność tak długo, jak długo kolekcja pozostaje niezmieniona. Jeśli zmiany są wprowadzane do kolekcji, takie jak dodawanie elementów lub zmiana pojemności, moduł wyliczający jest nieodwracalnie unieważniany, a następne wywołanie MoveNext lub IEnumerator.Reset zgłasza InvalidOperationExceptionelement .

Tylko .NET Core 3.0+: jedyne metodymutowania, które nie unieważniają modułów wyliczających, to Remove i Clear.

Moduł wyliczający nie ma wyłącznego dostępu do kolekcji, w związku z tym wyliczanie w kolekcji nie jest wewnętrznie procedurą odporną na wielowątkowość. Aby zagwarantować bezpieczeństwo wątków podczas wyliczania, można zablokować kolekcję podczas całego procesu wyliczania. Aby zezwolić wielu wątkom na dostęp do kolekcji w celu odczytu i zapisu danych, należy zaimplementować własny mechanizm synchronizacji.

Domyślne implementacje kolekcji w System.Collections.Generic przestrzeni nazw nie są synchronizowane.

Ta metoda jest operacją O(1).

Dotyczy

Zobacz też