2009-03-09 39 views
64

Có ai có ý kiến ​​gì về sự khác biệt thực tế giữa đối tượng System.Collections.Specialized.StringDictionary và System.Collections.Generic.Dictionary không?StringDictionary vs Dictionary <string, string>

Tôi đã sử dụng cả hai trong quá khứ mà không cần suy nghĩ nhiều về việc sẽ hoạt động tốt hơn, hoạt động tốt hơn với LINQ hoặc cung cấp bất kỳ lợi ích nào khác.

Bất kỳ suy nghĩ hoặc đề xuất nào về lý do tại sao tôi nên sử dụng cái kia?

Trả lời

77

Dictionary<string, string> là cách tiếp cận hiện đại hơn. Nó thực hiện IEnumerable<T> và nó phù hợp hơn cho công cụ LINQy.

StringDictionary là cách học cũ. Nó đã có trước khi generics ngày. Tôi sẽ sử dụng nó chỉ khi giao tiếp với mã di sản.

+2

Có sự khác biệt về hiệu suất giữa hai loại không? – thecoop

+0

Bạn nên điểm chuẩn để xem cái nào hoạt động tốt hơn cho tình huống đặc biệt của bạn. Tôi không mong đợi một sự khác biệt hiệu suất đáng chú ý. Tôi khuyên bạn nên sử dụng 'Dictionary ' cho tất cả các mã mới (trừ khi bạn cần nhắm mục tiêu 1.1). –

+1

@thecoop không có dữ liệu cứng để trình bày từ phía tôi bây giờ, nhưng một lần khi tôi đã kiểm tra tốc độ 'StringDictionary' thực hiện tồi tệ hơn (mặc dù tất cả những gì wont vấn đề chủ yếu). Thành thật mà nói, trước đây tôi đã có khái niệm rằng 'StringDictionary' là một bộ sưu tập chuyên biệt sorta có nghĩa là tăng tốc mọi thứ khi' chuỗi' là chìa khóa, và ngạc nhiên lớn của tôi khi nó hoạt động tồi tệ hơn trong thử nghiệm của tôi, tôi googled nó lên chỉ để tìm hiểu nó là nongeneric – nawfal

33

Tôi nghĩ StringDictionary là khá nhiều lỗi thời. Nó tồn tại trong v1.1 của khuôn khổ (trước khi generics), do đó, nó là một phiên bản cao cấp tại thời điểm đó (so với từ điển không chung chung), nhưng tại thời điểm này, tôi không tin rằng có bất kỳ lợi thế cụ thể cho nó qua từ điển.

Tuy nhiên, có những bất lợi đối với StringDictionary. StringDictionary thấp hơn trường hợp giá trị khóa của bạn tự động, và không có tùy chọn để kiểm soát này.

Xem:

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/

+0

'StringDictionary' có thể được sử dụng trong' Properites.Settings' trong khi 'Dictionary ' không thể. Vì vậy, quá cũ hay không, vẫn còn một số sử dụng cho 'StringDictionary'. – jahu

36

điểm khác.

này trả về null:

StringDictionary dic = new StringDictionary(); 
return dic["Hey"]; 

này ném một ngoại lệ:

Dictionary<string, string> dic = new Dictionary<string, string>(); 
return dic["Hey"]; 
+0

Các "ném một ngoại lệ" * tính năng * of 'Dictionary <> 'có nghĩa là tôi không bao giờ có thể sử dụng' [] '. Sử dụng StringDictionary đã làm sạch nhiều mã của tôi. –

+0

@ James Tôi trễ một chút nhưng có lẽ bạn nên dùng TryGetValue. –

+0

@ ŞafakGür - I * do * sử dụng TryGetValue() - bởi vì tôi không bao giờ có thể sử dụng '[]' vì nó ném một ngoại lệ. (StringDictionary chỉ giải quyết điều này cho một loại Từ điển) –

1

Bên cạnh đó là một lớp "hiện đại" hơn, tôi nhận thấy rằng từ điển là nhiều bộ nhớ hiệu quả hơn StringDictionary bằng lãi lớn .

+8

chúng tôi có thể sử dụng một số ở đây – Zonko

29

Như Reed Copsey đã chỉ ra, các trường hợp thấp hơn StringDictionary là các giá trị khóa của bạn. Đối với tôi, điều này hoàn toàn bất ngờ, và là một cái nút show-stopper.

private void testStringDictionary() 
{ 
    try 
    { 
     StringDictionary sd = new StringDictionary(); 
     sd.Add("Bob", "My name is Bob"); 
     sd.Add("joe", "My name is joe"); 
     sd.Add("bob", "My name is bob"); // << throws an exception because 
             // "bob" is already a key! 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

tôi thêm trả lời này để gây sự chú ý nhiều hơn đến khổng lồ sự khác biệt này, mà IMO là quan trọng hơn sự khác biệt tuổi học hiện đại vs.

+2

Nếu vì lý do nào đó, bạn muốn có cùng một hành vi với Từ điển có thể được sử dụng: Từ điển ht = new Dictionary (StringComparer.OrdinalIgnoreCase); htThêm ("Bob", "ff"); ht.Thêm ("bob", "ff"); // ném ngoại lệ – osexpert

2

StringDictionary đến từ .NET 1.1 và thực hiện IEnumerable

Dictionary<string, string> đến từ .NET 2.0 và thực hiện IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

IgnoreCase chỉ đặt ra cho chính trong StringDictionary

Dictionary<string, string> là tốt cho LINQ

 Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
     dictionary.Add("ITEM-1", "VALUE-1"); 
     var item1 = dictionary["item-1"];  // throws KeyNotFoundException 
     var itemEmpty = dictionary["item-9"]; // throws KeyNotFoundException 

     StringDictionary stringDictionary = new StringDictionary(); 
     stringDictionary.Add("ITEM-1", "VALUE-1"); 
     var item1String = stringDictionary["item-1"];  //return "VALUE-1" 
     var itemEmptystring = stringDictionary["item-9"]; //return null 

     bool isKey = stringDictionary.ContainsValue("VALUE-1"); //return true 
     bool isValue = stringDictionary.ContainsValue("value-1"); //return false 
1

Một trang có liên quan khác nt là (sửa tôi nếu tôi sai ở đây) System.Collections.Generic.Dictionary không thể được sử dụng trong cài đặt ứng dụng (Properties.Settings) trong khi System.Collections.Specialized.StringDictionary là.

Các vấn đề liên quan