2012-03-22 27 views
5

Tôi đã nhìn vào một số mã đồng nghiệp của tôi đã kiểm tra trong, nó trông như thế này:Tại sao .Net Dictionary trông giống như nó được sắp xếp?

return list.OrderBy(item => item.Order).ToDictionary(item => item.Id); 

tôi ngay lập tức nói với đồng nghiệp của tôi rằng mã của mình là sai, vì Dictionary là một bảng băm, một tổ chức phi -sắp bộ sưu tập. Anh ta nên sử dụng một bộ sưu tập bảo quản trật tự hoặc sắp xếp các mục sau khi đọc chúng từ từ điển với foreach, tôi nói.

Nhưng anh ấy trả lời "Không, không, mã của tôi là chính xác! Hãy nhìn: bây giờ tôi đã thêm OrderBy, các mục xuất hiện theo đúng thứ tự."

Hóa ra, trong trường hợp kiểm tra, anh ta đã đúng. Tôi đã thử trên một số dữ liệu khác, nhưng nó vẫn được sắp xếp hoàn hảo!

Tôi đã nói với anh ấy rằng anh ấy không nên dựa vào hành vi này, nhưng anh ấy không đồng ý và tôi đang gặp sự cố khi giải thích lý do. Bên cạnh đó, tôi quan tâm đến lý do tại sao thứ tự như vậy thường dường như được bảo tồn.

Vì vậy, câu hỏi của tôi là ... Tại sao Dictionary, một bộ sưu tập cơ bản chưa được phân loại, trông rất giống với nó được sắp xếp?

+3

Dictionary <> cung cấp không đảm bảo rằng bộ sưu tập là không có thứ tự . Nó không sử dụng mục đích ngẫu nhiên. Có, mã là sai. –

+1

có Justin, đây là bản sao. Câu trả lời của câu hỏi bạn liên kết là những gì tôi muốn. Làm thế nào bạn có thể tìm thấy bản sao quá nhanh trong số rất nhiều câu hỏi về từ điển? Tôi đã tìm kiếm và không thể tìm thấy nó. Cảm ơn bạn! –

+0

Tôi không biết (đó là lý do tại sao tôi đăng bài này như một bình luận) nhưng tôi tưởng tượng nó giống như trong SQL: các hàng được trả về bởi 'SELECT' được trả về theo thứ tự không xác định trừ khi mệnh đề' ORDER BY' được bao gồm . Thông thường, đặc biệt là trong các tập dữ liệu nhỏ, các hàng được trả về theo cùng thứ tự mà chúng được chèn vào, điều này dẫn đến rất nhiều người. (Tôi luôn nói với mọi người để bao gồm một 'ORDER BY' nếu họ quan tâm đến thứ tự của kết quả. Nó * có thể * làm việc mà không có nó, nhưng nó cũng có thể phá vỡ khủng khiếp.) –

Trả lời

6

Nó được sắp xếp, vì cách Dictionary được triển khai (và trong các trường hợp của bạn được thêm theo thứ tự). Nhưng đây là chi tiết triển khai.

Nói với đồng nghiệp của bạn có một lớp SortedDictionary tồn tại, điều này sẽ thuyết phục anh ta không thể dựa vào các mục đặt hàng với một đơn giản Dictionary;)

+0

Nó là một chi tiết thực hiện, chắc chắn, nhưng tôi không nghĩ rằng nó sẽ thay đổi. Có lẽ nó là ok để nói rằng Add() - chỉ từ điển để bảo tồn trật tự. –

+0

@EldritchConundrum Thực sự, bạn không nên giả định điều đó. Hiện tại nó là trường hợp, nhưng trong một phiên bản tương lai nó có thể không được. Và suy nghĩ về các triển khai khác của khung công tác (ví dụ như Mono), không có sự bảo đảm nào họ đã thực hiện từ điển theo cùng một cách. – ken2k

+0

Có. Quan trọng hơn, bây giờ tôi biết làm thế nào để xây dựng một trường hợp thử nghiệm mà mã đồng nghiệp của tôi sẽ thất bại trên;) Tôi chỉ cần loại bỏ và thêm trước khi foreach. –

3

Khi lặp qua từ điển bạn sẽ nhận được các mục trong đó trong the order they were inserted to the dictionary.

Trong ví dụ, danh sách được sắp xếp, sau đó mỗi mục sẽ được thêm vào từ điển lần lượt.

Kết quả cuối cùng là các mục trong từ điển nằm trong thứ tự sắp xếp của danh sách.

Tuy nhiên, điều này chỉ xảy ra là trường hợp với việc triển khai hiện tại Dictionary - không đảm bảo rằng nó sẽ vẫn như vậy.

Nếu bạn cần có các mục trong một Dictionary theo thứ tự cụ thể, bạn nên sử dụng SortedDictionary.

+0

Bạn có thể giải thích rõ hơn tại sao chúng được sắp xếp. Tôi muốn nói rằng họ được "đặt hàng" bởi băm của họ là tài sản "Id" –

+1

@LuisFilipe - Tôi không làm theo. Danh sách đã được sắp xếp ('danh sách.OrderBy (item => item.Order) 'sau đó được chuyển thành một' Dictionary'. Chuyển đổi hoạt động bằng cách thêm từng mục vào từ điển. Các mục trong từ điển được "đặt hàng" ở chỗ chúng được đặt theo thứ tự chèn. Vì chúng được _inserted_ theo thứ tự, từ điển theo thứ tự. – Oded

+0

Điều này có được đảm bảo bởi đặc điểm kỹ thuật/hợp đồng hay là một tạo phẩm về cách thực hiện cụ thể được viết? Nếu nó được đảm bảo hành vi, một trích dẫn sẽ hữu ích. –

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