Hashtable.GetEnumerator 方法

定义

返回循环访问 IDictionaryEnumeratorHashtable

public:
 virtual System::Collections::IDictionaryEnumerator ^ GetEnumerator();
public virtual System.Collections.IDictionaryEnumerator GetEnumerator ();
abstract member GetEnumerator : unit -> System.Collections.IDictionaryEnumerator
override this.GetEnumerator : unit -> System.Collections.IDictionaryEnumerator
Public Overridable Function GetEnumerator () As IDictionaryEnumerator

返回

IDictionaryEnumerator 的一个 Hashtable

实现

示例

以下示例比较 了 和 的用法GetEnumerator,以枚举 的内容Hashtableforeach

using namespace System;
using namespace System::Collections;

public class HashtableExample
{
public:
    static void Main()
    {
        // Creates and initializes a new Hashtable.
        Hashtable^ clouds = gcnew Hashtable();
        clouds->Add("Cirrus", "Castellanus");
        clouds->Add("Cirrocumulus", "Stratiformis");
        clouds->Add("Altostratus", "Radiatus");
        clouds->Add("Stratocumulus", "Perlucidus");
        clouds->Add("Stratus", "Fractus");
        clouds->Add("Nimbostratus", "Pannus");
        clouds->Add("Cumulus", "Humilis");
        clouds->Add("Cumulonimbus", "Incus");

        // Displays the keys and values of the Hashtable using GetEnumerator()

        IDictionaryEnumerator^ denum = clouds->GetEnumerator();
        DictionaryEntry dentry;

        Console::WriteLine();
        Console::WriteLine("    Cloud Type       Variation");
        Console::WriteLine("    -----------------------------");
        while (denum->MoveNext())
        {
            dentry = (DictionaryEntry) denum->Current;
            Console::WriteLine("    {0,-17}{1}", dentry.Key, dentry.Value);
        }
        Console::WriteLine();

        // Displays the keys and values of the Hashtable using foreach statement

        Console::WriteLine("    Cloud Type       Variation");
        Console::WriteLine("    -----------------------------");
        for each (DictionaryEntry de in clouds)
        {
            Console::WriteLine("    {0,-17}{1}", de.Key, de.Value);
        }
        Console::WriteLine();
    }
};

int main()
{
    HashtableExample::Main();
}

// The program displays the following output to the console:
//
//    Cloud Type       Variation
//    -----------------------------
//    Cirrocumulus     Stratiformis
//    Stratocumulus    Perlucidus
//    Cirrus           Castellanus
//    Cumulus          Humilis
//    Nimbostratus     Pannus
//    Stratus          Fractus
//    Altostratus      Radiatus
//    Cumulonimbus     Incus
//
//    Cloud Type       Variation
//    -----------------------------
//    Cirrocumulus     Stratiformis
//    Stratocumulus    Perlucidus
//    Cirrus           Castellanus
//    Cumulus          Humilis
//    Nimbostratus     Pannus
//    Stratus          Fractus
//    Altostratus      Radiatus
//    Cumulonimbus     Incus*/
using System;
using System.Collections;

public class HashtableExample
{
    public static void Main()
    {
        // Creates and initializes a new Hashtable.
        Hashtable clouds = new Hashtable();
        clouds.Add("Cirrus", "Castellanus");
        clouds.Add("Cirrocumulus", "Stratiformis");
        clouds.Add("Altostratus", "Radiatus");
        clouds.Add("Stratocumulus", "Perlucidus");
        clouds.Add("Stratus", "Fractus");
        clouds.Add("Nimbostratus", "Pannus");
        clouds.Add("Cumulus", "Humilis");
        clouds.Add("Cumulonimbus", "Incus");

        // Displays the keys and values of the Hashtable using GetEnumerator()

        IDictionaryEnumerator denum = clouds.GetEnumerator();
        DictionaryEntry dentry;

        Console.WriteLine();
        Console.WriteLine("    Cloud Type       Variation");
        Console.WriteLine("    -----------------------------");
        while (denum.MoveNext())
        {
            dentry = (DictionaryEntry) denum.Current;
            Console.WriteLine("    {0,-17}{1}", dentry.Key, dentry.Value);
        }
        Console.WriteLine();

        // Displays the keys and values of the Hashtable using foreach statement

        Console.WriteLine("    Cloud Type       Variation");
        Console.WriteLine("    -----------------------------");
        foreach (DictionaryEntry de in clouds)
        {
            Console.WriteLine("    {0,-17}{1}", de.Key, de.Value);
        }
        Console.WriteLine();
    }
}

// The program displays the following output to the console:
//
//    Cloud Type       Variation
//    -----------------------------
//    Cirrocumulus     Stratiformis
//    Stratocumulus    Perlucidus
//    Cirrus           Castellanus
//    Cumulus          Humilis
//    Nimbostratus     Pannus
//    Stratus          Fractus
//    Altostratus      Radiatus
//    Cumulonimbus     Incus
//
//    Cloud Type       Variation
//    -----------------------------
//    Cirrocumulus     Stratiformis
//    Stratocumulus    Perlucidus
//    Cirrus           Castellanus
//    Cumulus          Humilis
//    Nimbostratus     Pannus
//    Stratus          Fractus
//    Altostratus      Radiatus
//    Cumulonimbus     Incus*/
Imports System.Collections

Public Class HashtableExample
    Public Shared Sub Main()
        ' Creates and initializes a new Hashtable.
        Dim clouds As New Hashtable()
        clouds.Add("Cirrus", "Castellanus")
        clouds.Add("Cirrocumulus", "Stratiformis")
        clouds.Add("Altostratus", "Radiatus")
        clouds.Add("Stratocumulus", "Perlucidus")
        clouds.Add("Stratus", "Fractus")
        clouds.Add("Nimbostratus", "Pannus")
        clouds.Add("Cumulus", "Humilis")
        clouds.Add("Cumulonimbus", "Incus")

        ' Displays the keys and values of the Hashtable using GetEnumerator()

        Dim denum As IDictionaryEnumerator = clouds.GetEnumerator()
        Dim dentry As DictionaryEntry

        Console.WriteLine()
        Console.WriteLine("    Cloud Type       Variation")
        Console.WriteLine("    -----------------------------")
        While denum.MoveNext()
            dentry = CType(denum.Current, DictionaryEntry)
            Console.WriteLine("    {0,-17}{1}", dentry.Key, dentry.Value)
        End While
        Console.WriteLine()

        ' Displays the keys and values of the Hashtable using foreach statement

        Console.WriteLine("    Cloud Type       Variation")
        Console.WriteLine("    -----------------------------")
        For Each de As DictionaryEntry in clouds
            Console.WriteLine("    {0,-17}{1}", de.Key, de.Value)
        Next de
        Console.WriteLine()
    End Sub
End Class

' The program displays the following output to the console:
'
'    Cloud Type       Variation
'    -----------------------------
'    Cirrocumulus     Stratiformis
'    Stratocumulus    Perlucidus
'    Cirrus           Castellanus
'    Cumulus          Humilis
'    Nimbostratus     Pannus
'    Stratus          Fractus
'    Altostratus      Radiatus
'    Cumulonimbus     Incus
'
'    Cloud Type       Variation
'    -----------------------------
'    Cirrocumulus     Stratiformis
'    Stratocumulus    Perlucidus
'    Cirrus           Castellanus
'    Cumulus          Humilis
'    Nimbostratus     Pannus
'    Stratus          Fractus
'    Altostratus      Radiatus
'    Cumulonimbus     Incus*/

注解

C# 语言的 foreach 语句(在 Visual Basic 中为 for each)隐藏了枚举数的复杂性。 因此,建议使用 foreach,而不是直接操作枚举数。

枚举器可用于读取集合中的数据,但不能用于修改基础集合。

最初,枚举数定位在集合中第一个元素的前面。 Reset 也会将枚举器放回此位置。 在此位置上,未定义 Current。 因此,在读取 MoveNext 的值之前,必须调用 Current 将枚举器向前移动到集合的第一个元素。

在调用 CurrentMoveNext 之前,Reset 返回同一对象。 MoveNextCurrent 设置为下一个元素。

如果 MoveNext 传递集合的末尾,则枚举器位于集合中的最后一个元素之后,并 MoveNext 返回 false。 当枚举器位于此位置时,对 MoveNext 的后续调用也会返回 false。 如果最后一次MoveNext调用返回,falseCurrent则为未定义。 若要再次将 Current 设置为集合的第一个元素,可以调用 Reset 并接着调用 MoveNext

只要集合保持不变,枚举器就仍有效。 如果对集合进行更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,而且其行为是不确定的。

该枚举数不具有独占访问集合的权限;因此,枚举整个集合本质上不是一个线程安全的过程。 若要确保枚举过程中的线程安全性,可以在整个枚举过程中锁定集合。 若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。

此方法是一种 O(1) 操作。

由于序列化和反序列化 枚举 Hashtable 器可能会导致元素重新排序,因此如果不调用 Reset 方法,则无法继续枚举。

适用于

另请参阅