2013-08-19 46 views
5

Tôi sử dụng số Dictionary<string, Item> để lưu trữ các mặt hàng của riêng mình.
Lý do sử dụng từ điển là các phím là duy nhất và truy cập nhanh.Thứ tự mục từ điển

Trong hầu hết các trường hợp, tôi chỉ sử dụng DICionary để truy cập các mục đơn lẻ. Nhưng trong một trường hợp tôi phải lặp qua từ điển - ở đây tôi cần phải có các mục theo thứ tự chúng được thêm vào.

Tôi chỉ biết rằng từ điển sử dụng một hashtable nội bộ, nhưng tôi không biết nó được tổ chức như thế nào.

Câu hỏi:
Các mục trong từ điển được đặt hàng khi chúng được thêm vào chưa?
Điều gì xảy ra với thứ tự khi các mục được thêm vào hoặc bị xóa?

+0

Bạn có thể sử dụng 'OrderedDictionary' trong C# cho từ điển đặt hàng xem MSDN: http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx – wudzik

+0

Hãy xem câu trả lời tuyệt vời này trên cùng một chủ đề. http://stackoverflow.com/questions/6384710/why-is-a-dictionary-not-ordered?rq=1 –

+1

@KingKing: 'OrderedDictionary' cũng được triển khai dưới dạng HashTable (bên cạnh mảng) nhưng nó là đã ra lệnh.Tuy nhiên, ngay cả khi tôi biết rằng đó là một thực hiện HashTable tôi không nhất thiết phải biết rằng nó không bị sắp xếp theo tự nhiên. –

Trả lời

4

Chúng không được đặt hàng. Thứ tự của các phần tử trong từ điển là không xác định.

MSDN: "The order in which the items are returned is undefined."

Bạn có thể sử dụng một OrderedDictionary thay vì truy cập vào một mục thông qua chỉ mục. Hoặc, nếu bạn muốn nó được đặt hàng bằng khóa, bạn có thể sử dụng SortedDictionary.

Cập nhậtWhy is a dictionary not ordered by nature?

+0

Câu trả lời hay nhất vì nó bao gồm thông tin về 'OrderedDictionary' từ .NET 4.5 – wudzik

+0

Một lời cảnh báo trên lớp SortedDictionary, truy xuất là O (log n) và chèn thậm chí còn tệ hơn. – flindeberg

+0

@wudzik 'OrderedDictionary' đã tồn tại từ .Net 2 –

0

Từ điển không được đặt hàng, vì vậy bạn không thể dựa vào các giá trị ở đó. Bạn có thể thử sử dụng OrderedDictionary. Nếu bạn thích một generic, kiểm tra liên kết sau:

No generic implementation of OrderedDictionary?

+0

@wudzik Đó là khoảng từ .NET 2, nhưng nó không phải là chung chung. Liên kết tôi đăng cho thấy một triển khai chung cho nó. – Artless

+0

ok, xin lỗi, xấu của tôi :) – wudzik

0

Không, họ không ra lệnh, như bạn có thể đọc trong Microsoft library:

Đối với mục đích của điều tra, mỗi mục trong từ điển được coi là cấu trúc KeyValuePair biểu thị giá trị và khóa của nó. Thứ tự mà các mục được trả về là không xác định.

1

Nếu bạn có một cái nhìn tại the msdn pages bạn thấy rằng (đối với câu hỏi đầu tiên của bạn)

Thứ tự mà các mặt hàng được trả về là undefined.

Và câu trả lời cho câu hỏi thứ hai của bạn là câu hỏi được thực hiện bởi bảng băm.

Tôi không thể đề xuất một hành động tốt hơn mà không biết yêu cầu thực tế của bạn là gì. Nhưng ngay sau khi bạn bắt đầu rối tung xung quanh với nhiều phím và sắp xếp đơn đặt hàng, bạn sẽ mất O (1) hồi của bạn.

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