2012-03-29 9 views
10

Widzę wiele pytań/odpowiedzi na temat konwersji Hashtable na Dictionary, ale jak mogę przekonwertować słownik na Hashtable?Jak przekonwertować słownik <> do Hashtable w C#?

+1

A dlaczego miałbyś tego potrzebować? Hashtable jest bardzo specyficzny, ponieważ wartość obliczona na kluczu tworzy położenie wartości ... a słownik jest po prostu kolekcją prostą (klucz, wartość). Dlaczego chcesz przekonwertować słownik na tablicę? –

+0

Na najprostszym poziomie jestem leniwy. Obiekt typu 'Hashtable' jest używany w wielu miejscach. – jpints14

+0

To samo w sobie nie jest powodem, aby z niego korzystać. Słowniki i Hashtables to różne bestie, które są używane w różnych okolicznościach. Wiesz, lista jest również używana w wielu miejscach ... Dlaczego więc jej nie użyć? : -s –

Odpowiedz

23

Najprostszym sposobem jest użycie konstruktora Hashtable:

 var dictionary = new Dictionary<object, object>(); 
     //... fill the dictionary 
     var hashtable = new Hashtable(dictionary); 
4

wydaje się dość rzadko zdarza się chce zrobić, ale w najprostszym:

var hash = new Hashtable(); 
foreach(var pair in dictionary) { 
    hash.Add(pair.Key,pair.Value); 
} 

(zakładając brak niezwykłych „narzędzi wpisane sprawdzić równość ale nie bez typu równość sprawdzić” etc)

+1

Teraz wystarczy uwzględnić to w rozszerzeniu 'ToHashTable' i voila! – Dismissile

+1

Istnieje nawet [konstruktor] (http://msdn.microsoft.com/en-us/library/kdkta2sx.aspx), który robi to samo. – Joey

+0

Oto, o czym myślałem. Zastanawiał się, czy nie było tak oczywistego sposobu na zrobienie tego. Jednak dziękuję! – jpints14

8
Dictionary<int, string> dictionary = new Dictionary<int, string> 
    { 
     {1,"One"}, 
     {2,"Two"} 
    }; 
Hashtable hashtable = new Hashtable(dictionary); 

Wypróbuj

3

Można rozważyć użycie przeciążenie Hashtable konstruktora, która pobiera parametr IEqualityComparer:

var hashtable = new Hashtable(dictionary, (IEqualityComparer) dictionary.Comparer); 

W ten sposób Twój Hashtable używa tego samego Comparer jako słownika. Na przykład, jeśli w słowniku używany jest ciąg znaków niewrażliwy na wielkość liter, można również ustawić opcję rozróżniania małych i małych liter w rozmiarze Hashtable. Np .:

var d = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); 
d.Add("a", "a"); 
d.Add("b", "b"); 

bool found; 
found = d.ContainsKey("A"); // true 

var hashtable1 = new Hashtable(d); 
var hashtable2 = new Hashtable(d, (IEqualityComparer) d.Comparer); 

found = hashtable1["A"] != null; // false - by default it's case-sensitive 

found = hashtable2["A"] != null; // true - uses same comparer as the original dictionary 
Powiązane problemy