2012-01-14 48 views
9

Có cách nào để lặp qua một từ điển, theo thứ tự sắp xếp, được sắp xếp theo VALUE khóa không? Tôi đã đọc abut đối tượng "SortedDictionary", nhưng thật đáng buồn, đó là sắp xếp theo khóa. Một giải pháp sẽ là để tôi lật tất cả các phím của tôi với giá trị của tôi, và đặt chúng vào một SortedDictionary (vì chúng là tất cả các số nguyên) - Tuy nhiên, tôi không hoàn toàn chắc chắn làm thế nào để đi với một trong hai.C# Lặp lại từ điển được sắp xếp theo giá trị

+1

Bao lâu thì bạn cần phải làm điều đó? Làm thế nào nó có hiệu quả? Bạn có sẵn sàng trao đổi bộ nhớ với tốc độ cao hơn không? – svick

+0

Chỉ hoạt động trên khoảng 500 kết quả và chỉ một lần. Luôn sẵn sàng trao đổi bộ nhớ để có tốc độ nhanh hơn: D –

Trả lời

18

Lấy cặp khóa/giá trị, sắp xếp chúng và lặp lại. Chết dễ dàng sử dụng LINQ:

foreach(var pair in dictionary.OrderBy(p => p.Value)) { 
    // work with pair.Key and pair.Value 
} 
+0

Ahh, cảm ơn! :) Điều đó có vẻ chính xác như những gì tôi cần. LINQ này tôi tiếp tục nghe về, nó là gì? –

+2

@GeorgesOatesLarsen: Đó là điều bạn đang bỏ lỡ bằng cách không sử dụng nó. Bạn có thể muốn đọc [this] (http://msdn.microsoft.com/en-us/library/bb308959.aspx) hoặc Google nó (có giới hạn để được giới thiệu tốt hơn bây giờ). – Jon

0

Đối với hoàn, mã gợi ý ở trên (dictionary.OrderBy (p => p.Value)) "sẽ không" làm việc với nhiều loại tùy chỉnh.

Đặt hàngBằng cách sử dụng IComparable để có thể so sánh hai đối tượng. Nếu Giá trị trong từ điển của bạn là loại tùy chỉnh thì phải triển khai IComparable để có thể sắp xếp giá trị theo cách phù hợp.

Đọc trên here.

+0

"phải triển khai IComparable" - không nhất thiết. OrderBy() có hai quá tải. Một trong số chúng hoạt động như bạn mô tả, nhưng cái thứ hai chấp nhận một đối tượng IComparable tùy chỉnh để có thể đặt bất kỳ loại giá trị nào. – DXM

+0

@DXM, quá tải khác chấp nhận 'IComparer', không phải' IComparable', điều đó sẽ không có ý nghĩa nhiều. Ngoài ra, tôi không nghĩ rằng điều này có liên quan đến các loại giá trị, nó hoạt động tương tự đối với mọi loại. – svick

+0

@svick - xấu của tôi về lỗi đánh máy, bạn nói đúng, đó là IComparer, nhưng quá tải thứ hai chính xác cho những gì OP đang yêu cầu. Bạn có thể viết đối tượng so sánh của riêng bạn để so sánh bất kỳ thứ gì bạn muốn và nạp nó vào OrderBy(). Và bởi "giá trị" tôi không có nghĩa là giá trị so với tham chiếu. Ý tôi là giá trị so với khóa. Tôi nhận ra sự so sánh sẽ làm việc với các loại giá trị cũng như các loại tham chiếu. Nếu đồng ý với câu trả lời này, OrderBy chỉ có thể được sử dụng bởi các loại thực hiện IComparable, bạn có thể giải thích về tình trạng quá tải thứ hai đó không? – DXM

0

// loại từ điển bằng giá trị

foreach (KeyValuePair<datatype, datatype> item in dictionary) 
{ 
//do something by value....accessing item.value 
} 
Các vấn đề liên quan