Hashtable.GetEnumerator 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
返回循环访问 IDictionaryEnumerator 的 Hashtable。
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,以枚举 的内容Hashtable。foreach
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 将枚举器向前移动到集合的第一个元素。
在调用 Current 或 MoveNext 之前,Reset 返回同一对象。 MoveNext 将 Current 设置为下一个元素。
如果 MoveNext 传递集合的末尾,则枚举器位于集合中的最后一个元素之后,并 MoveNext 返回 false
。 当枚举器位于此位置时,对 MoveNext 的后续调用也会返回 false
。 如果最后一次MoveNext调用返回,false
Current则为未定义。 若要再次将 Current 设置为集合的第一个元素,可以调用 Reset 并接着调用 MoveNext。
只要集合保持不变,枚举器就仍有效。 如果对集合进行更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,而且其行为是不确定的。
该枚举数不具有独占访问集合的权限;因此,枚举整个集合本质上不是一个线程安全的过程。 若要确保枚举过程中的线程安全性,可以在整个枚举过程中锁定集合。 若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。
此方法是一种 O(1)
操作。
由于序列化和反序列化 枚举 Hashtable 器可能会导致元素重新排序,因此如果不调用 Reset 方法,则无法继续枚举。