2009-11-23 35 views
8

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

14

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)

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 
+3

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

+0

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. –

2

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)

2

Hashtable được tạo ra khi C# không hỗ trợ Generics được nêu ra.

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