HybridDictionary Class
Implements IDictionary by using a ListDictionary while the collection is small, and then switching to a Hashtable when the collection gets large.
For a list of all members of this type, see HybridDictionary Members.
System.Object
System.Collections.Specialized.HybridDictionary
[Visual Basic] <Serializable> Public Class HybridDictionary Implements IDictionary, ICollection, IEnumerable [C#] [Serializable] public class HybridDictionary : IDictionary, ICollection, IEnumerable [C++] [Serializable] public __gc class HybridDictionary : public IDictionary, ICollection, IEnumerable [JScript] public Serializable class HybridDictionary implements IDictionary, ICollection, IEnumerable
Thread Safety
Public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe.
This implementation does not provide a synchronized (thread-safe) wrapper for a HybridDictionary, but derived classes can create their own synchronized versions of the HybridDictionary using the SyncRoot property.
Enumerating through a collection is intrinsically not a thread-safe procedure. Even when a collection is synchronized, other threads could still modify the collection, which causes the enumerator to throw an exception. To guarantee thread safety during enumeration, you can either lock the collection during the entire enumeration or catch the exceptions resulting from changes made by other threads.
Remarks
This class is recommended for cases where the number of elements in a dictionary is unknown. It takes advantage of the improved performance of a ListDictionary with small collections, and offers the flexibility of switching to a Hashtable which handles larger collections better than ListDictionary.
If the initial size of the collection is greater than the optimal size for a ListDictionary, the collection is stored in a Hashtable right away to avoid the overhead of copying elements from the ListDictionary to a Hashtable.
The constructor accepts a Boolean parameter that allows the user to specify whether the collection ignores the case when comparing strings. If the collection is case-sensitive, it uses the key's implementations of Object.GetHashCode and Object.Equals. If the collection is case-insensitive, it performs a simple ordinal case-insensitive comparison, which obeys the casing rules of the invariant culture only. By default, the collection is case-sensitive. For more information on the invariant culture, see System.Globalization.CultureInfo.
A key cannot be a null reference (Nothing in Visual Basic), but a value can.
[Visual Basic, C#] The foreach statement of the C# language (for each in Visual Basic) requires the type of each element in the collection. Since each element of the HybridDictionary is a key-and-value pair, the element type is not the type of the key or the type of the value. Instead, the element type is DictionaryEntry. For example:
[C#] foreach (DictionaryEntry myDE in myHybridDictionary) {...} [Visual Basic] Dim myDE As DictionaryEntry For Each myDE In myHybridDictionary ... Next myDE
[Visual Basic, C#] The foreach statement is a wrapper around the enumerator, which only allows reading from, not writing to, the collection.
.NET Compact Framework Platform Note: All keys added to a case-insensitive HybridDictionary must have string values.
Example
[Visual Basic, C#, C++] The following code example demonstrates several of the properties and methods of HybridDictionary.
[Visual Basic] Imports System 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") ' Displays the values in the HybridDictionary in three different ways. Console.WriteLine("Displays the elements using for each:") PrintKeysAndValues(myCol) Console.WriteLine("Displays the elements using the IDictionaryEnumerator:") PrintKeysAndValues2(myCol) Console.WriteLine("Displays the elements using the Keys, Values, Count, and indexer properties:") PrintKeysAndValues3(myCol) ' Copies the HybridDictionary to an array with DictionaryEntry elements. Dim myArr(myCol.Count) As DictionaryEntry myCol.CopyTo(myArr, 0) ' Displays the values in the array. Console.WriteLine("Displays the elements in the array:") Console.WriteLine(" KEY VALUE") Dim i As Integer For i = 0 To myArr.Length - 1 Console.WriteLine(" {0,-25} {1}", myArr(i).Key, myArr(i).Value) Next i Console.WriteLine() ' Searches for a key. If myCol.Contains("Kiwis") Then Console.WriteLine("The collection contains the key ""Kiwis"".") Else Console.WriteLine("The collection does not contain the key ""Kiwis"".") End If Console.WriteLine() ' Deletes a key. myCol.Remove("Plums") Console.WriteLine("The collection contains the following elements after removing ""Plums"":") PrintKeysAndValues(myCol) ' Clears the entire collection. myCol.Clear() Console.WriteLine("The collection contains the following elements after it is cleared:") PrintKeysAndValues(myCol) End Sub 'Main Public Shared Sub PrintKeysAndValues(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 'PrintKeysAndValues 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 'PrintKeysAndValues2 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 'PrintKeysAndValues3 End Class 'SamplesHybridDictionary 'This code produces the following output. ' '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 indexer 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 ' 'Displays the elements in the array: ' 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 ' 'The collection does not contain the key "Kiwis". ' 'The collection contains the following elements after removing "Plums": ' 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 ' Navel Oranges 1.29 ' Fuji Apples 1.29 ' 'The collection contains the following elements after it is cleared: ' KEY VALUE ' [C#] 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" ); // Displays the values in the HybridDictionary in three different ways. Console.WriteLine( "Displays the elements using foreach:" ); PrintKeysAndValues( myCol ); Console.WriteLine( "Displays the elements using the IDictionaryEnumerator:" ); PrintKeysAndValues2( myCol ); Console.WriteLine( "Displays the elements using the Keys, Values, Count, and indexer properties:" ); PrintKeysAndValues3( myCol ); // Copies the HybridDictionary to an array with DictionaryEntry elements. DictionaryEntry[] myArr = new DictionaryEntry[myCol.Count]; myCol.CopyTo( myArr, 0 ); // Displays the values in the array. Console.WriteLine( "Displays the elements in the array:" ); Console.WriteLine( " KEY VALUE" ); for ( int i = 0; i < myArr.Length; i++ ) Console.WriteLine( " {0,-25} {1}", myArr[i].Key, myArr[i].Value ); Console.WriteLine(); // Searches for a key. if ( myCol.Contains( "Kiwis" ) ) Console.WriteLine( "The collection contains the key \"Kiwis\"." ); else Console.WriteLine( "The collection does not contain the key \"Kiwis\"." ); Console.WriteLine(); // Deletes a key. myCol.Remove( "Plums" ); Console.WriteLine( "The collection contains the following elements after removing \"Plums\":" ); PrintKeysAndValues( myCol ); // Clears the entire collection. myCol.Clear(); Console.WriteLine( "The collection contains the following elements after it is cleared:" ); PrintKeysAndValues( myCol ); } public static void PrintKeysAndValues( IDictionary myCol ) { Console.WriteLine( " KEY VALUE" ); foreach ( DictionaryEntry de in myCol ) Console.WriteLine( " {0,-25} {1}", de.Key, de.Value ); Console.WriteLine(); } 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(); } 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 the following output. 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 indexer 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 Displays the elements in the array: 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 The collection does not contain the key "Kiwis". The collection contains the following elements after removing "Plums": 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 Navel Oranges 1.29 Fuji Apples 1.29 The collection contains the following elements after it is cleared: KEY VALUE */ [C++] #using <mscorlib.dll> #using <System.dll> using namespace System; using namespace System::Collections; using namespace System::Collections::Specialized; void PrintKeysAndValues( IDictionary* myCol ) { Console::WriteLine( S" KEY VALUE" ); IEnumerator* myEnum = myCol->GetEnumerator(); while (myEnum->MoveNext()) { DictionaryEntry de = *__try_cast<DictionaryEntry*>(myEnum->Current); Console::WriteLine( S" {0,-25} {1}", de.Key, de.Value ); } Console::WriteLine(); } void PrintKeysAndValues2( IDictionary* myCol ) { IDictionaryEnumerator* myEnumerator = myCol->GetEnumerator(); Console::WriteLine( S" KEY VALUE" ); while ( myEnumerator->MoveNext() ) Console::WriteLine( S" {0,-25} {1}", myEnumerator->Key, myEnumerator->Value ); Console::WriteLine(); } void PrintKeysAndValues3( HybridDictionary* myCol ) { String* myKeys[] = new String*[myCol->Count]; myCol->Keys->CopyTo( myKeys, 0 ); Console::WriteLine( S" INDEX KEY VALUE" ); for ( int i = 0; i < myCol->Count; i++ ) Console::WriteLine( S" {0,-5} {1,-25} {2}", __box(i), myKeys->Item[i], myCol->Item[myKeys[i]] ); Console::WriteLine(); } int main() { // Creates and initializes a new HybridDictionary. HybridDictionary* myCol = new HybridDictionary(); myCol->Add( S"Braeburn Apples", S"1.49" ); myCol->Add( S"Fuji Apples", S"1.29" ); myCol->Add( S"Gala Apples", S"1.49" ); myCol->Add( S"Golden Delicious Apples", S"1.29" ); myCol->Add( S"Granny Smith Apples", S"0.89" ); myCol->Add( S"Red Delicious Apples", S"0.99" ); myCol->Add( S"Plantain Bananas", S"1.49" ); myCol->Add( S"Yellow Bananas", S"0.79" ); myCol->Add( S"Strawberries", S"3.33" ); myCol->Add( S"Cranberries", S"5.98" ); myCol->Add( S"Navel Oranges", S"1.29" ); myCol->Add( S"Grapes", S"1.99" ); myCol->Add( S"Honeydew Melon", S"0.59" ); myCol->Add( S"Seedless Watermelon", S"0.49" ); myCol->Add( S"Pineapple", S"1.49" ); myCol->Add( S"Nectarine", S"1.99" ); myCol->Add( S"Plums", S"1.69" ); myCol->Add( S"Peaches", S"1.99" ); // Displays the values in the HybridDictionary in three different ways. Console::WriteLine( S"Displays the elements using foreach:" ); PrintKeysAndValues( myCol ); Console::WriteLine( S"Displays the elements using the IDictionaryEnumerator:" ); PrintKeysAndValues2( myCol ); Console::WriteLine( S"Displays the elements using the Keys, Values, Count, and indexer properties:" ); PrintKeysAndValues3( myCol ); // Copies the HybridDictionary to an array with DictionaryEntry elements. DictionaryEntry myArr[] = new DictionaryEntry[myCol->Count]; myCol->CopyTo( myArr, 0 ); // Displays the values in the array. Console::WriteLine( S"Displays the elements in the array:" ); Console::WriteLine( S" KEY VALUE" ); for ( int i = 0; i < myArr->Length; i++ ) Console::WriteLine( S" {0,-25} {1}", myArr[i].Key, myArr[i].Value ); Console::WriteLine(); // Searches for a key. if ( myCol->Contains( S"Kiwis" ) ) Console::WriteLine( S"The collection contains the key \"Kiwis\"." ); else Console::WriteLine( S"The collection does not contain the key \"Kiwis\"." ); Console::WriteLine(); // Deletes a key. myCol->Remove( S"Plums" ); Console::WriteLine( S"The collection contains the following elements after removing \"Plums\":" ); PrintKeysAndValues( myCol ); // Clears the entire collection. myCol->Clear(); Console::WriteLine( S"The collection contains the following elements after it is cleared:" ); PrintKeysAndValues( myCol ); } /* This code produces the following output. 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 indexer 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 Displays the elements in the array: 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 The collection does not contain the key "Kiwis". The collection contains the following elements after removing "Plums": 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 Navel Oranges 1.29 Fuji Apples 1.29 The collection contains the following elements after it is cleared: KEY VALUE */
[JScript] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button
in the upper-left corner of the page.
Requirements
Namespace: System.Collections.Specialized
Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family, .NET Compact Framework
Assembly: System (in System.dll)
See Also
HybridDictionary Members | System.Collections.Specialized Namespace | IDictionary | ListDictionary | Hashtable | CaseInsensitiveHashCodeProvider | Object.GetHashCode | Object.Equals | Performing Culture-Insensitive String Operations