HybridDictionary.IEnumerable.GetEnumerator Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zwraca wartość IEnumerator , która iteruje za pośrednictwem elementu HybridDictionary.
virtual System::Collections::IEnumerator ^ System.Collections.IEnumerable.GetEnumerator() = System::Collections::IEnumerable::GetEnumerator;
System.Collections.IEnumerator IEnumerable.GetEnumerator ();
abstract member System.Collections.IEnumerable.GetEnumerator : unit -> System.Collections.IEnumerator
override this.System.Collections.IEnumerable.GetEnumerator : unit -> System.Collections.IEnumerator
Function GetEnumerator () As IEnumerator Implements IEnumerable.GetEnumerator
Zwraca
Element IEnumerator dla elementu HybridDictionary.
Implementuje
Przykłady
Poniższy przykład kodu wylicza elementy elementu HybridDictionary.
#using <System.dll>
using namespace System;
using namespace System::Collections;
using namespace System::Collections::Specialized;
void PrintKeysAndValues1( IDictionary^ myCol );
void PrintKeysAndValues2( IDictionary^ myCol );
void PrintKeysAndValues3( HybridDictionary^ myCol );
int main()
{
// Creates and initializes a new HybridDictionary.
HybridDictionary^ myCol = gcnew HybridDictionary;
myCol->Add( "Braeburn Apples", "1.49" );
myCol->Add( "Fuji Apples", "1.29" );
myCol->Add( "Gala Apples", "1.49" );
myCol->Add( "Golden Delicious Apples", "1.29" );
myCol->Add( "Granny Smith Apples", "0.89" );
myCol->Add( "Red Delicious Apples", "0.99" );
myCol->Add( "Plantain Bananas", "1.49" );
myCol->Add( "Yellow Bananas", "0.79" );
myCol->Add( "Strawberries", "3.33" );
myCol->Add( "Cranberries", "5.98" );
myCol->Add( "Navel Oranges", "1.29" );
myCol->Add( "Grapes", "1.99" );
myCol->Add( "Honeydew Melon", "0.59" );
myCol->Add( "Seedless Watermelon", "0.49" );
myCol->Add( "Pineapple", "1.49" );
myCol->Add( "Nectarine", "1.99" );
myCol->Add( "Plums", "1.69" );
myCol->Add( "Peaches", "1.99" );
// Display the contents of the collection using for each. This is the preferred method.
Console::WriteLine( "Displays the elements using for each:" );
PrintKeysAndValues1( myCol );
// Display the contents of the collection using the enumerator.
Console::WriteLine( "Displays the elements using the IDictionaryEnumerator:" );
PrintKeysAndValues2( myCol );
// Display the contents of the collection using the Keys, Values, Count, and Item properties.
Console::WriteLine( "Displays the elements using the Keys, Values, Count, and Item properties:" );
PrintKeysAndValues3( myCol );
}
// Uses the foreach statement which hides the complexity of the enumerator.
// NOTE: The foreach statement is the preferred way of enumerating the contents of a collection.
void PrintKeysAndValues1( IDictionary^ myCol ) {
Console::WriteLine( " KEY VALUE" );
for each ( DictionaryEntry^ de in myCol )
Console::WriteLine( " {0,-25} {1}", de->Key, de->Value );
Console::WriteLine();
}
// Uses the enumerator.
void PrintKeysAndValues2( IDictionary^ myCol )
{
IDictionaryEnumerator^ myEnumerator = myCol->GetEnumerator();
Console::WriteLine( " KEY VALUE" );
while ( myEnumerator->MoveNext() )
Console::WriteLine( " {0,-25} {1}", myEnumerator->Key, myEnumerator->Value );
Console::WriteLine();
}
// Uses the Keys, Values, Count, and Item properties.
void PrintKeysAndValues3( HybridDictionary^ myCol )
{
array<String^>^myKeys = gcnew array<String^>(myCol->Count);
myCol->Keys->CopyTo( myKeys, 0 );
Console::WriteLine( " INDEX KEY VALUE" );
for ( int i = 0; i < myCol->Count; i++ )
Console::WriteLine( " {0,-5} {1,-25} {2}", i, myKeys[ i ], myCol[ myKeys[ i ] ] );
Console::WriteLine();
}
/*
This code produces output similar to the following:
Displays the elements using for each:
KEY VALUE
Seedless Watermelon 0.49
Nectarine 1.99
Cranberries 5.98
Plantain Bananas 1.49
Honeydew Melon 0.59
Pineapple 1.49
Strawberries 3.33
Grapes 1.99
Braeburn Apples 1.49
Peaches 1.99
Red Delicious Apples 0.99
Golden Delicious Apples 1.29
Yellow Bananas 0.79
Granny Smith Apples 0.89
Gala Apples 1.49
Plums 1.69
Navel Oranges 1.29
Fuji Apples 1.29
Displays the elements using the IDictionaryEnumerator:
KEY VALUE
Seedless Watermelon 0.49
Nectarine 1.99
Cranberries 5.98
Plantain Bananas 1.49
Honeydew Melon 0.59
Pineapple 1.49
Strawberries 3.33
Grapes 1.99
Braeburn Apples 1.49
Peaches 1.99
Red Delicious Apples 0.99
Golden Delicious Apples 1.29
Yellow Bananas 0.79
Granny Smith Apples 0.89
Gala Apples 1.49
Plums 1.69
Navel Oranges 1.29
Fuji Apples 1.29
Displays the elements using the Keys, Values, Count, and Item properties:
INDEX KEY VALUE
0 Seedless Watermelon 0.49
1 Nectarine 1.99
2 Cranberries 5.98
3 Plantain Bananas 1.49
4 Honeydew Melon 0.59
5 Pineapple 1.49
6 Strawberries 3.33
7 Grapes 1.99
8 Braeburn Apples 1.49
9 Peaches 1.99
10 Red Delicious Apples 0.99
11 Golden Delicious Apples 1.29
12 Yellow Bananas 0.79
13 Granny Smith Apples 0.89
14 Gala Apples 1.49
15 Plums 1.69
16 Navel Oranges 1.29
17 Fuji Apples 1.29
*/
using System;
using System.Collections;
using System.Collections.Specialized;
public class SamplesHybridDictionary {
public static void Main() {
// Creates and initializes a new HybridDictionary.
HybridDictionary myCol = new HybridDictionary();
myCol.Add( "Braeburn Apples", "1.49" );
myCol.Add( "Fuji Apples", "1.29" );
myCol.Add( "Gala Apples", "1.49" );
myCol.Add( "Golden Delicious Apples", "1.29" );
myCol.Add( "Granny Smith Apples", "0.89" );
myCol.Add( "Red Delicious Apples", "0.99" );
myCol.Add( "Plantain Bananas", "1.49" );
myCol.Add( "Yellow Bananas", "0.79" );
myCol.Add( "Strawberries", "3.33" );
myCol.Add( "Cranberries", "5.98" );
myCol.Add( "Navel Oranges", "1.29" );
myCol.Add( "Grapes", "1.99" );
myCol.Add( "Honeydew Melon", "0.59" );
myCol.Add( "Seedless Watermelon", "0.49" );
myCol.Add( "Pineapple", "1.49" );
myCol.Add( "Nectarine", "1.99" );
myCol.Add( "Plums", "1.69" );
myCol.Add( "Peaches", "1.99" );
// Display the contents of the collection using foreach. This is the preferred method.
Console.WriteLine( "Displays the elements using foreach:" );
PrintKeysAndValues1( myCol );
// Display the contents of the collection using the enumerator.
Console.WriteLine( "Displays the elements using the IDictionaryEnumerator:" );
PrintKeysAndValues2( myCol );
// Display the contents of the collection using the Keys, Values, Count, and Item properties.
Console.WriteLine( "Displays the elements using the Keys, Values, Count, and Item properties:" );
PrintKeysAndValues3( myCol );
}
// Uses the foreach statement which hides the complexity of the enumerator.
// NOTE: The foreach statement is the preferred way of enumerating the contents of a collection.
public static void PrintKeysAndValues1( IDictionary myCol ) {
Console.WriteLine( " KEY VALUE" );
foreach ( DictionaryEntry de in myCol )
Console.WriteLine( " {0,-25} {1}", de.Key, de.Value );
Console.WriteLine();
}
// Uses the enumerator.
// NOTE: The foreach statement is the preferred way of enumerating the contents of a collection.
public static void PrintKeysAndValues2( IDictionary myCol ) {
IDictionaryEnumerator myEnumerator = myCol.GetEnumerator();
Console.WriteLine( " KEY VALUE" );
while ( myEnumerator.MoveNext() )
Console.WriteLine( " {0,-25} {1}", myEnumerator.Key, myEnumerator.Value );
Console.WriteLine();
}
// Uses the Keys, Values, Count, and Item properties.
public static void PrintKeysAndValues3( HybridDictionary myCol ) {
String[] myKeys = new String[myCol.Count];
myCol.Keys.CopyTo( myKeys, 0 );
Console.WriteLine( " INDEX KEY VALUE" );
for ( int i = 0; i < myCol.Count; i++ )
Console.WriteLine( " {0,-5} {1,-25} {2}", i, myKeys[i], myCol[myKeys[i]] );
Console.WriteLine();
}
}
/*
This code produces output similar to the following:
Displays the elements using foreach:
KEY VALUE
Seedless Watermelon 0.49
Nectarine 1.99
Cranberries 5.98
Plantain Bananas 1.49
Honeydew Melon 0.59
Pineapple 1.49
Strawberries 3.33
Grapes 1.99
Braeburn Apples 1.49
Peaches 1.99
Red Delicious Apples 0.99
Golden Delicious Apples 1.29
Yellow Bananas 0.79
Granny Smith Apples 0.89
Gala Apples 1.49
Plums 1.69
Navel Oranges 1.29
Fuji Apples 1.29
Displays the elements using the IDictionaryEnumerator:
KEY VALUE
Seedless Watermelon 0.49
Nectarine 1.99
Cranberries 5.98
Plantain Bananas 1.49
Honeydew Melon 0.59
Pineapple 1.49
Strawberries 3.33
Grapes 1.99
Braeburn Apples 1.49
Peaches 1.99
Red Delicious Apples 0.99
Golden Delicious Apples 1.29
Yellow Bananas 0.79
Granny Smith Apples 0.89
Gala Apples 1.49
Plums 1.69
Navel Oranges 1.29
Fuji Apples 1.29
Displays the elements using the Keys, Values, Count, and Item properties:
INDEX KEY VALUE
0 Seedless Watermelon 0.49
1 Nectarine 1.99
2 Cranberries 5.98
3 Plantain Bananas 1.49
4 Honeydew Melon 0.59
5 Pineapple 1.49
6 Strawberries 3.33
7 Grapes 1.99
8 Braeburn Apples 1.49
9 Peaches 1.99
10 Red Delicious Apples 0.99
11 Golden Delicious Apples 1.29
12 Yellow Bananas 0.79
13 Granny Smith Apples 0.89
14 Gala Apples 1.49
15 Plums 1.69
16 Navel Oranges 1.29
17 Fuji Apples 1.29
*/
Imports System.Collections
Imports System.Collections.Specialized
Public Class SamplesHybridDictionary
Public Shared Sub Main()
' Creates and initializes a new HybridDictionary.
Dim myCol As New HybridDictionary()
myCol.Add("Braeburn Apples", "1.49")
myCol.Add("Fuji Apples", "1.29")
myCol.Add("Gala Apples", "1.49")
myCol.Add("Golden Delicious Apples", "1.29")
myCol.Add("Granny Smith Apples", "0.89")
myCol.Add("Red Delicious Apples", "0.99")
myCol.Add("Plantain Bananas", "1.49")
myCol.Add("Yellow Bananas", "0.79")
myCol.Add("Strawberries", "3.33")
myCol.Add("Cranberries", "5.98")
myCol.Add("Navel Oranges", "1.29")
myCol.Add("Grapes", "1.99")
myCol.Add("Honeydew Melon", "0.59")
myCol.Add("Seedless Watermelon", "0.49")
myCol.Add("Pineapple", "1.49")
myCol.Add("Nectarine", "1.99")
myCol.Add("Plums", "1.69")
myCol.Add("Peaches", "1.99")
' Display the contents of the collection using For Each. This is the preferred method.
Console.WriteLine("Displays the elements using For Each:")
PrintKeysAndValues1(myCol)
' Display the contents of the collection using the enumerator.
Console.WriteLine("Displays the elements using the IDictionaryEnumerator:")
PrintKeysAndValues2(myCol)
' Display the contents of the collection using the Keys, Values, Count, and Item properties.
Console.WriteLine("Displays the elements using the Keys, Values, Count, and Item properties:")
PrintKeysAndValues3(myCol)
End Sub
' Uses the For Each statement which hides the complexity of the enumerator.
' NOTE: The For Each statement is the preferred way of enumerating the contents of a collection.
Public Shared Sub PrintKeysAndValues1(myCol As IDictionary)
Console.WriteLine(" KEY VALUE")
Dim de As DictionaryEntry
For Each de In myCol
Console.WriteLine(" {0,-25} {1}", de.Key, de.Value)
Next de
Console.WriteLine()
End Sub
' Uses the enumerator.
' NOTE: The For Each statement is the preferred way of enumerating the contents of a collection.
Public Shared Sub PrintKeysAndValues2(myCol As IDictionary)
Dim myEnumerator As IDictionaryEnumerator = myCol.GetEnumerator()
Console.WriteLine(" KEY VALUE")
While myEnumerator.MoveNext()
Console.WriteLine(" {0,-25} {1}", myEnumerator.Key, myEnumerator.Value)
End While
Console.WriteLine()
End Sub
' Uses the Keys, Values, Count, and Item properties.
Public Shared Sub PrintKeysAndValues3(myCol As HybridDictionary)
Dim myKeys(myCol.Count) As [String]
myCol.Keys.CopyTo(myKeys, 0)
Console.WriteLine(" INDEX KEY VALUE")
Dim i As Integer
For i = 0 To myCol.Count - 1
Console.WriteLine(" {0,-5} {1,-25} {2}", i, myKeys(i), myCol(myKeys(i)))
Next i
Console.WriteLine()
End Sub
End Class
'This code produces output similar to the following:
'
'Displays the elements using For Each:
' KEY VALUE
' Seedless Watermelon 0.49
' Nectarine 1.99
' Cranberries 5.98
' Plantain Bananas 1.49
' Honeydew Melon 0.59
' Pineapple 1.49
' Strawberries 3.33
' Grapes 1.99
' Braeburn Apples 1.49
' Peaches 1.99
' Red Delicious Apples 0.99
' Golden Delicious Apples 1.29
' Yellow Bananas 0.79
' Granny Smith Apples 0.89
' Gala Apples 1.49
' Plums 1.69
' Navel Oranges 1.29
' Fuji Apples 1.29
'
'Displays the elements using the IDictionaryEnumerator:
' KEY VALUE
' Seedless Watermelon 0.49
' Nectarine 1.99
' Cranberries 5.98
' Plantain Bananas 1.49
' Honeydew Melon 0.59
' Pineapple 1.49
' Strawberries 3.33
' Grapes 1.99
' Braeburn Apples 1.49
' Peaches 1.99
' Red Delicious Apples 0.99
' Golden Delicious Apples 1.29
' Yellow Bananas 0.79
' Granny Smith Apples 0.89
' Gala Apples 1.49
' Plums 1.69
' Navel Oranges 1.29
' Fuji Apples 1.29
'
'Displays the elements using the Keys, Values, Count, and Item properties:
' INDEX KEY VALUE
' 0 Seedless Watermelon 0.49
' 1 Nectarine 1.99
' 2 Cranberries 5.98
' 3 Plantain Bananas 1.49
' 4 Honeydew Melon 0.59
' 5 Pineapple 1.49
' 6 Strawberries 3.33
' 7 Grapes 1.99
' 8 Braeburn Apples 1.49
' 9 Peaches 1.99
' 10 Red Delicious Apples 0.99
' 11 Golden Delicious Apples 1.29
' 12 Yellow Bananas 0.79
' 13 Granny Smith Apples 0.89
' 14 Gala Apples 1.49
' 15 Plums 1.69
' 16 Navel Oranges 1.29
' 17 Fuji Apples 1.29
Uwagi
Instrukcja foreach
języka C# (for each
w Visual Basic) ukrywa złożoność modułów wyliczania. Dlatego użycie foreach
jest zalecane zamiast bezpośredniego manipulowania 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. Reset powoduje również powrót modułu wyliczającego do tej pozycji. W tej pozycji wywołanie Current zgłasza wyjątek. W związku z tym należy wywołać metodę MoveNext , aby przejść do pierwszego elementu kolekcji przed odczytaniem wartości Current.
Current Metoda zwraca ten sam obiekt do momentu wywołania metody MoveNext lub Reset . MoveNext ustawia Current element na następny.
Jeśli MoveNext przejdzie koniec kolekcji, moduł wyliczający zostanie umieszczony po ostatnim elemecie w kolekcji i MoveNext zwróci wartość false
. Gdy moduł wyliczający znajduje się na tym stanowisku, kolejne wywołania , aby MoveNext również zwrócić false
wartość . Jeśli ostatnie wywołanie zwracane MoveNextfalse
, wywołanie Current metody zgłasza wyjątek. Aby ponownie ustawić Current element na pierwszy element kolekcji, możesz wywołać Reset metodę , a następnie .MoveNext
Moduł wyliczający zachowuje ważność tak długo, jak długo kolekcja pozostaje niezmieniona. W przypadku wprowadzania zmian w kolekcji, takich jak dodawanie, modyfikowanie lub usuwanie elementów, moduł wyliczający jest nieodwracalnie unieważniany, a następne wywołanie MoveNext metody lub Reset zgłasza InvalidOperationExceptionbłąd . Jeśli kolekcja jest modyfikowana między elementami MoveNext i Current, Current zwraca element ustawiony na , nawet jeśli moduł wyliczający jest już unieważniony.
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ść. Nawet gdy kolekcja jest synchronizowana, inne wątki nadal mogą ją modyfikować. Powoduje to zgłaszanie wyjątku przez moduł wyliczający. Aby zagwarantować bezpieczeństwo wątków podczas wyliczania, można zablokować kolekcję podczas całego procesu wyliczania albo rejestrować wyjątki wynikłe ze zmian wprowadzanych przez inne wątków.
Ta metoda jest operacją O(1).