Tôi muốn lưu trữ bộ sưu tập tùy chỉnh của mình dưới dạng Khóa và Giá trị cũng là bộ sưu tập Danh sách chuỗi. Tôi có thể đạt được điều này bằng cả KeyvaluePair và hashtable. Collction phù hợp nhất mang lại cho tôi nhiều lợi thế hơn về tính linh hoạt là gì?Sự khác nhau giữa KeyValuePair và Hashtable trong .NET là gì?
Trả lời
Hashtable là truy cập ngẫu nhiên và sử dụng nội bộ System.Collections.DictionaryEntry cho các mục từ .NET 1.1; trong khi một gõ mạnh mẽ System.Collections.Generic.Dictionary trong .NET 2.0 sử dụng System.Collections.Generic.KeyValuePair mục và cũng là truy cập ngẫu nhiên.
(Lưu ý:. Câu trả lời này là thiên về .NET framework 2.0 khi cung cấp ví dụ - đó là lý do tại sao nó vẫn tiếp tục với KeyValuePair thay vì DictionaryEntry - câu hỏi ban đầu cho thấy đây là Type mong muốn làm việc với)
Vì KeyValuePair là một lớp độc lập, bạn có thể tạo danh sách hoặc mảng của các thể hiện KeyValuePair theo cách thủ công, nhưng danh sách hoặc mảng sẽ được truy cập tuần tự. Điều này trái ngược với Hashtable hoặc Dictionary mà trong đó tạo ra các cá thể phần tử riêng của nó và được truy cập ngẫu nhiên. Cả hai đều là cách hợp lệ để sử dụng các cá thể KeyValuePair. Xem thêm see MSDN info about selecting a Collection class to use.
Tóm tắt: truy cập tuần tự là nhanh nhất khi sử dụng một nhóm nhỏ các mục trong khi một nhóm lớn hơn các mục được hưởng quyền truy cập ngẫu nhiên.
của Microsoft giải pháp lai: Một bộ sưu tập đặc biệt thú vị giới thiệu trong .NET 1.1 là System.Collections.Specialized.HybridDictionary trong đó sử dụng một đại diện nội ListDictionary (tuần tự truy cập) trong khi bộ sưu tập là nhỏ, và sau đó tự động chuyển sang một đại diện nội Hashtable (truy cập ngẫu nhiên) khi thu được lớn"
C# mẫu Mã
các mẫu sau đây cho thấy các cặp cùng trường Key-Value tạo cho các kịch bản khác nhau -. truy cập tuần tự (hai ví dụ) theo sau là một ví dụ về truy cập ngẫu nhiên. Để đơn giản trong những ví dụ này, tất cả chúng sẽ sử dụng khóa int với giá trị chuỗi - bạn có thể thay thế trong các kiểu dữ liệu bạn cần sử dụng.
Đây là một System.Collections.Generic.List mạnh mẽ của cặp khóa-giá trị.
(truy cập tuần tự)
// --- 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);
Dưới đây là một System.Array của cặp khóa-giá trị.
(truy cập tuần tự)
// --- 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);
Dưới đây là một từ điển các cặp Key-Value.
(truy cập ngẫu nhiên)
// --- 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
Một bit liên quan là Hashtable là lớp .Net 1.1, trong khi KeyValuePair được giới thiệu trong .NET 2.0. (với sự giới thiệu của generics)
Hashtable được tạo ra khi C# không hỗ trợ Generics được nêu ra.
- 1. Sự khác nhau giữa Hashtable và Properties là gì?
- 2. Sự khác biệt b/w Hashtable, Dictionary và KeyValuePair là gì?
- 3. Sự khác biệt giữa Hashtable và Từ điển là gì?
- 4. Sự khác nhau giữa C#, .NET và CLI là gì?
- 5. Sự khác biệt giữa .Net Hashtable, Java Hashtable & HashMap
- 6. Sự khác nhau giữa Hashtable và Collections.synchronizedMap (HashMap)
- 7. Sự khác nhau giữa SqlCommand.CommandTimeout và SqlConnection.ConnectionTimeout là gì?
- 8. Sự khác nhau giữa dataview và datatable là gì?
- 9. Trong Python, sự khác nhau giữa ".append()" và "+ = []" là gì?
- 10. Sự khác nhau giữa == và = trong Prolog là gì?
- 11. Sự khác nhau giữa // và /// trong Visual Studio là gì?
- 12. Sự khác nhau giữa: = và + = trong tạo tệp là gì?
- 13. Sự khác nhau giữa * và. * Trong MATLAB là gì?
- 14. Sự khác nhau giữa $ @ và $ * trong UNIX là gì?
- 15. Sự khác nhau giữa: = và = trong MySQL là gì?
- 16. Sự khác nhau giữa "||" là gì và "hoặc" trong Perl?
- 17. Sự khác nhau giữa 'eq' và '= ~' trong Perl là gì?
- 18. Sự khác nhau giữa 'và #' trong Lisp là gì?
- 19. Sự khác nhau giữa DataContractJsonSerializer và JavaScriptSerializer là gì?
- 20. Sự khác nhau giữa biểu thức lambda và vị từ trong .NET là gì?
- 21. Sự khác nhau giữa Phiên bản và 'Phiên bản thời gian chạy' trong .Net là gì?
- 22. Sự khác nhau giữa EnumerateFiles và EnumerateFileSystemEntries trong .NET 4 là gì?
- 23. Sự khác nhau giữa các thuộc tính CurrentCulture và CurrentUICulture của CultureInfo trong .NET là gì?
- 24. Sự khác nhau giữa X509Certificate2 và X509Certificate trong .NET là gì?
- 25. Sự khác nhau giữa VCS và SCM là gì?
- 26. Sự khác nhau giữa ssize_t và ptrdiff_t là gì?
- 27. Sự khác nhau giữa java.lang.Math và java.lang.StrictMath là gì?
- 28. Sự khác nhau giữa static_cast và reinterpret_cast là gì?
- 29. Sự khác nhau giữa init() và window.init() là gì?
- 30. Sự khác nhau giữa fancyLocalization và preferredLanguage là gì?
Ngoài ra, bạn không thể truy cập vào thành phần của Danh sách bằng cách sử dụng giá trị khóa. Như ngụ ý ở đây, bạn sẽ cần phải lặp lại danh sách để tìm khóa bạn muốn.Trong khi đó, HashTable sẽ cho phép bạn truy cập các giá trị của bạn bằng cách sử dụng khóa làm chỉ mục. – jheddings
Cảm ơn @jheddings, tôi đã thêm nhận xét mã để cho biết liệu phần tử có đang được truy cập bởi vị trí hoặc khóa chỉ mục hay không, để làm rõ những gì bạn đã nói. –