2012-12-21 30 views
9

Giả sử tôi có một Dictionary và tôi thêm mỗi mục nhập keyvalue theo thứ tự cụ thể.
Bây giờ, nếu tôi muốn sau này có thể lặp lại số Dictionary trong các mục nhập cùng thứ tự đã được thêm vào, đó có phải là thứ tự tôi nhận được với vòng lặp đơn giản foreach trên từ điển này không?Lặp lại từ điển với foreach, theo thứ tự nào được thực hiện?

Nếu không, tôi sẽ vui mừng khi biết làm thế nào tôi có thể làm điều đó, tôi biết điều này có thể được thực hiện dễ dàng với List thay vì Dictionary nhưng tôi không muốn.

Cảm ơn

+4

Không, từ điển không duy trì trật tự. Thật không may, tôi nghĩ rằng bạn cần phải sử dụng một danh sách. – phoog

+0

sử dụng 'IEnumerable >' thay thế (ví dụ: Danh sách <>) – sehe

+2

@sehe Dictionary * là * một 'IEnumerable > '. – phoog

Trả lời

15

Bình thường Dictionary không đảm bảo thứ tự các mục.

Bạn cần OrderedDictionary nếu bạn muốn duy trì các mục đặt hàng được thêm vào nó. Lưu ý rằng không có phiên bản chung của lớp này trong .Net framework, do đó, hoặc phải từ bỏ một số loại an toàn hoặc tìm thực hiện khác (tức là https://www.codeproject.com/Articles/18615/OrderedDictionary-T-A-generic-implementation-of-IOsuggested by Tim S).

Hoặc nếu tra cứu O (nhật ký n) tốt và phải sắp xếp các phím - SortedDictionary.

+2

Lưu ý rằng lớp này không sử dụng Generics, và vì vậy nó không phải là loại an toàn. Nếu bạn muốn bộ sưu tập của bạn sử dụng Generics (tôi muốn giới thiệu nó), hãy sử dụng một cái gì đó như thế này thực hiện 'OrderedDictionary': http://www.codeproject.com/Articles/18615/OrderedDictionary-TA-generic-implementation- của-IO –

2

Dictionary s là bảng băm, có nghĩa là bạn không thể đảm bảo rằng lặp lại các cặp sẽ trả lại theo đúng thứ tự mà bạn thêm vào.

Mỗi cặp là KeyValuePair<T_K, T_V>, vì vậy bạn có thể có List<KeyValuePair<string, string>> để cho phép bạn lặp lại theo thứ tự bạn thêm nếu đó là những gì bạn cần.

+0

Bạn có thể giải thích thêm về' List > ', đoán bạn không có ý nghĩa với danh sách từ điển phải không? – JavaSa

+1

@JavaSa Khi bạn liệt kê 'Dictionary' bạn nhận được một liệt kê' KeyValuePair 's, vì vậy tôi chỉ sử dụng một danh sách. Câu trả lời của Alexei Levenkov chắc chắn chính xác hơn mặc dù – climbage

2

Loại nội bộ của từ điển sẽ phụ thuộc vào hàm băm được sử dụng. Tuy nhiên nếu bạn cần một chế độ xem được sắp xếp của dữ liệu, bạn có thể sử dụng Enumerable.OrderBy.

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