2009-11-23 11 views

Antwort

14

Hashtable ist Random Access und intern verwendet System.Collections.DictionaryEntry für seine Artikel von .NET 1.1; während eine stark typisierte System.Collections.Generic.Dictionary in .NET 2.0 verwendet System.Collections.Generic.KeyValuePair Elemente und ist auch Random Access.

. (Anmerkung: Diese Antwort ist auf .NET 2.0 Framework vorgespannt, wenn Beispiele bereitstellt - das ist, warum es mit KeyValuePair statt Dictionary weiter - die ursprüngliche Frage zeigt dies die gewünschte Art ist, mit zu arbeiten)

Da KeyValuePair eine unabhängige Klasse ist, können Sie manuell eine Liste oder ein Array von KeyValuePair-Instanzen erstellen, auf eine Liste oder ein Array wird jedoch sequenziell zugegriffen. Dies steht im Gegensatz zu der Hashtable oder dem Dictionary, die intern ihre eigenen Elementinstanzen erstellen und auf die zufällig zugegriffen wird. Beide sind gültige Möglichkeiten, KeyValuePair-Instanzen zu verwenden. Siehe auch see MSDN info about selecting a Collection class to use.

Zusammenfassend: sequenzieller Zugriff ist am schnellsten, wenn ein kleiner Satz von Elementen verwendet wird, während ein größerer Satz von Elementen von einem wahlfreien Zugriff profitiert.

Microsofts Hybridlösung: Eine interessante Spezialsammlung eingeführt in .NET 1.1 ist System.Collections.Specialized.HybridDictionary die verwenden eine Listdictionary interne Darstellung (sequentiell zugegriffen wird), während die Sammlung klein ist, und schaltet dann automatisch auf eine Hashtable interne Darstellung (wahlfrei zugegriffen), wenn die Sammlung bekommt große“

C# Beispielcode

die folgenden Beispiele zeigen die gleichen Paar Schlüsselwert Instanzen für verschiedene Szenarien erstellt -. sequenziellen Zugriff (zwei Beispiele) gefolgt von einem Beispiel für einen wahlfreien Zugriff. Zur Vereinfachung wird in diesen Beispielen ein int-Schlüssel mit einem String-Wert verwendet, den Sie in den zu verwendenden Datentypen ersetzen können.

Hier ist eine stark typisierte System.Collections.Generic.List von Schlüssel-Wert-Paaren.
(Sequential Zugriff)

// --- Make a list of 3 Key-Value pairs (sequentially accessed) --- 
// build it... 
List<KeyValuePair<int, string>> listKVP = new List<KeyValuePair<int, string>>(); 
listKVP.Add(new KeyValuePair<int, string>(1, "one")); 
listKVP.Add(new KeyValuePair<int, string>(2, "two")); 
// access first element - by position... 
Console.Write("key:" + listKVP[0].Key + "value:" + listKVP[0].Value); 

Hier ist ein System.Array von Schlüssel-Wert-Paare.
(Sequential Zugriff)

// --- Make an array of 3 Key-Value pairs (sequentially accessed) --- 
// build it... 
KeyValuePair<int, string>[] arrKVP = new KeyValuePair<int, string>[3]; 
arrKVP[0] = new KeyValuePair<int, string>(1, "one"); 
arrKVP[1] = new KeyValuePair<int, string>(2, "two"); 
// access first element - by position... 
Console.Write("key:" + arrKVP[0].Key + "value:" + arrKVP[0].Value); 

Hier ist ein Wörterbuch von Schlüssel-Wert-Paare.
(Random Access)

// --- Make a Dictionary (strongly typed) of 3 Key-Value pairs (randomly accessed) --- 
// build it ... 
Dictionary<int, string> dict = new Dictionary<int, string>(); 
dict[1] = "one"; 
dict[2] = "two"; 
// access first element - by key... 
Console.Write("key:1 value:" + dict[1]); // returns a string for key 1 
+3

Sie können auch nicht auf ein Element einer Liste zugreifen, indem Sie einen Schlüsselwert verwenden. Wie hier angedeutet, müssten Sie die Liste durchlaufen, um den gewünschten Schlüssel zu finden.Mit HashTable können Sie auf Ihre Werte zugreifen, indem Sie den Schlüssel als Index verwenden. – jheddings

+0

Dank @jheddings, ich habe Code-Kommentare hinzugefügt, um anzuzeigen, ob auf das Element durch Indexposition oder Schlüssel zugegriffen wird, um zu verdeutlichen, was Sie gesagt haben. –

2

Ein relevantes Bit ist, dass Hashtable eine .NET Klasse ist, während KeyValuePair in .NET 2.0 eingeführt wurde. (mit der Einführung von Generika)

2

Hashtable erstellt wurde, als C# Generika noch nicht unterstützen.

Verwandte Themen