Поделиться через


Dictionary<TKey,TValue>.IDictionary.GetEnumerator Метод

Определение

Возвращает значение IDictionaryEnumerator для 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

Возвращаемое значение

IDictionaryДля IDictionaryEnumerator .

Реализации

Примеры

В следующем примере кода показано, как перечислить пары "ключ-значение" в словаре с помощью foreach инструкции (For Each в Visual Basic), которая скрывает использование перечислителя. В частности, обратите внимание, что перечислитель для System.Collections.IDictionary интерфейса возвращает DictionaryEntry объекты, а не KeyValuePair<TKey,TValue> объекты.

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");

        // When you use foreach to enumerate dictionary elements
        // with the IDictionary interface, the elements are retrieved
        // as DictionaryEntry objects instead of KeyValuePair objects.
        foreach( DictionaryEntry de in openWith )
        {
            Console.WriteLine($"Key = {de.Key}, Value = {de.Value}");
        }
    }
}
open System
open System.Collections
open System.Collections.Generic

// Create a new dictionary of strings, with string keys,
// and access it using the IDictionary interface.
let openWith: IDictionary = 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")

// When you use foreach to enumerate dictionary elements
// with the IDictionary interface, the elements are retrieved
// as DictionaryEntry objects instead of KeyValuePair objects.
printfn ""

for de in openWith do
    let de = de :?> DictionaryEntry
    printfn $"For key = {de.Key}, value = {de.Value}"
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()
        For Each de As DictionaryEntry In openWith
            Console.WriteLine("Key = {0}, Value = {1}", _
                de.Key, de.Value)
        Next 

    End Sub

End Class

Комментарии

Для перечисления каждый элемент является структурой DictionaryEntry .

Оператор foreach языка C# (For Each в Visual Basic) скрывает сложность перечислителей. Поэтому рекомендуется использовать foreach вместо непосредственного управления перечислителем.

Перечислители можно использовать для чтения данных в коллекции, но их нельзя использовать для изменения базовой коллекции.

Изначально перечислитель размещается перед первым элементом в коллекции. Метод Reset также возвращает перечислитель к этой позиции. На этой позиции Entry не определен. Поэтому необходимо вызвать MoveNext метод, чтобы перенаставить перечислителя в первый элемент коллекции, прежде чем считывать значение Entry.

Свойство Entry возвращает тот же элемент до MoveNext вызова метода или Reset метода. MoveNext задает Entry для следующего элемента.

Если MoveNext передает конец коллекции, перечислитель размещается после последнего элемента в коллекции и MoveNext возвращается false. Если перечислитель находится в этой позиции, последующие вызовы MoveNext также возвращаются false. Если последний вызов MoveNext возвращен false, Entry не определен. Чтобы снова задать Entry для первого элемента коллекции, можно вызвать Reset после этого MoveNext.

Перечислитель остается допустимым, пока коллекция остается неизменной. Если изменения вносятся в коллекцию, например добавление элементов или изменение емкости, перечислитель безвозвратно недопустим и следующий вызов MoveNext или IEnumerator.Reset вызывает исключение InvalidOperationException.

Только .NET Core 3.0+ — единственные методы, которые не являются недопустимыми перечислителямиRemove.Clear

Перечислитель не имеет монопольного доступа к коллекции; Таким образом, перечисление через коллекцию по сути не является потокобезопасной процедурой. Чтобы гарантировать безопасность потоков во время перечисления, можно заблокировать коллекцию во время всего перечисления. Чтобы разрешить доступ к коллекции несколькими потоками для чтения и записи, необходимо реализовать собственную синхронизацию.

Реализации коллекций по умолчанию в System.Collections.Generic пространстве имен не синхронизируются.

Этот метод является операцией O(1).

Применяется к

См. также раздел