2012-03-29 34 views
10

Tôi thấy nhiều câu hỏi/câu trả lời về cách chuyển đổi một Hashtable thành một từ điển, nhưng làm thế nào tôi có thể chuyển đổi một từ điển thành một Hashtable?Làm thế nào để chuyển đổi từ điển <> sang Hashtable trong C#?

+1

Và tại sao bạn cần điều đó? Một Hashtable rất cụ thể trong đó một giá trị được tính trên khóa tạo ra vị trí của giá trị ... và từ điển chỉ là một bộ sưu tập thẳng (khóa, giá trị). Tại sao bạn muốn chuyển đổi từ điển thành hashtable? –

+0

Ở mức độ đơn giản nhất, tôi lười biếng. Đối tượng thuộc loại 'Hashtable' được sử dụng ở nhiều nơi. – jpints14

+0

Điều đó không phải là lý do để sử dụng nó. Từ điển và Hashtables là những con thú khác nhau được sử dụng trong các trường hợp khác nhau. Bạn biết đấy, một Danh sách cũng được sử dụng ở nhiều nơi ... Vậy tại sao không sử dụng? : -s –

Trả lời

23

Cách dễ nhất là sử dụng hàm tạo của Hashtable:

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

vẻ khá hiếm để muốn làm, nhưng đơn giản nhất:

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

(giả sử không có bất thường "cụ gõ kiểm tra bình đẳng nhưng không untyped bình đẳng kiểm tra" vv)

+1

Bây giờ chỉ cần bao gồm điều này trong một phương pháp mở rộng 'ToHashTable' và thì đấy! – Dismissile

+1

Thậm chí có một [hàm tạo] (http://msdn.microsoft.com/en-us/library/kdkta2sx.aspx) thực hiện điều tương tự. – Joey

+0

Đây là điều tôi đang nghĩ đến. Đã tự hỏi nếu có một cách không rõ ràng như vậy để làm điều đó. Tuy nhiên, cảm ơn bạn! – jpints14

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

Hãy thử điều này

3

Bạn có thể muốn xem xét sử dụng quá tải Hashtable constructor mà phải mất một tham số IEqualityComparer:

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

Bằng cách này, Hashtable của bạn sử dụng cùng một Comparer như từ điển. Ví dụ: nếu từ điển của bạn đã sử dụng khóa chuỗi phân biệt chữ hoa chữ thường, bạn có thể muốn Hashtable cũng không phân biệt chữ hoa chữ thường. Ví dụ:

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 
Các vấn đề liên quan