2010-05-06 73 views
8

Tôi có một SortedDictionary như đã định nghĩa như thế này:Từ điển được sắp xếp đảo ngược?

SortedDictionary<TPriority, Queue<TValue>> dict; 

Nhưng tôi muốn duy trì dict theo thứ tự ngược. Tôi cho rằng tôi cần đặt số Comparer, nhưng tôi sẽ sử dụng bộ so sánh nào cho một số TPriority chung? Lưu ý rằng TPriority thực hiện IComparable.

+0

thể trùng lặp của [Xếp Sắp xếp từ điển trong .NET] (http://stackoverflow.com/questions/931891/reverse-sorted-dictionary-in -net) – nawfal

Trả lời

16

Bạn có thể tạo một Comparer ngược khá dễ dàng:

public sealed class ReverseComparer<T> : IComparer<T> { 
    private readonly IComparer<T> inner; 
    public ReverseComparer() : this(null) { } 
    public ReverseComparer(IComparer<T> inner) { 
     this.inner = inner ?? Comparer<T>.Default; 
    } 
    int IComparer<T>.Compare(T x, T y) { return inner.Compare(y, x); } 
} 

Bây giờ vượt qua đó vào các nhà xây dựng cho các từ điển:

var dict = new SortedDictionary<TPriority, Queue<TValue>>(
       new ReverseComparer<TPriority>()); 
+0

Đánh tôi với cú đấm. :-p – LBushkin

+0

Tại sao vượt qua 'null' và sau đó kiểm tra nó, khi bạn có thể đã thông qua trong' Comparer .Default' ở nơi đầu tiên? – mpen

+0

Sử dụng 'niêm phong',' chỉ đọc' và toán tử kết hợp rỗng. –

1

Nếu bạn có thể sử dụng LINQ, bạn chỉ có thể làm:

dict.Keys.Reverse(); 

này mang lại các phím của bộ sưu tập theo thứ tự ngược.

CHỈNH SỬA: Lớp SortedDictionary được gán IComparer<T> khi được tạo và không thể thay đổi điều này sau khi thực tế. Tuy nhiên, bạn có thể tạo mới SortedDictionary<T> từ bản gốc:

class ReverseComparer<T> : IComparer<T> { 
    private readonly m_InnerComparer = new Comparer<T>.Default; 

    public ReverseComparer(IComparer<T> inner) { 
     m_InnerComparer = inner; } 

    public int Compare(T first, T second) { 
     return -m_InnerComparer.Compare(first, second); } 
} 

var reverseDict = new SortedDictionary<TPriority, Queue<TValue>>(dict, 
          new ReverseComparer(Comparer<TPriority>.Default)); 
+0

Vâng, tôi không có nghĩa là tôi muốn các phím theo thứ tự ngược lại, tôi có nghĩa là tôi muốn duy trì dict theo thứ tự ngược lại để khi tôi lặp lại nó, nó sẽ luôn luôn theo thứ tự giảm dần ... – mpen

+0

@Mark: Có lẽ bạn không nên nói rằng bạn muốn các phím theo thứ tự ngược lại. Bạn nên chỉnh sửa câu hỏi của mình để đảm bảo câu hỏi rõ ràng vì lợi ích của những người tìm kiếm trong tương lai. –

+0

@Tom: Tôi không nói rằng tôi "muốn các phím theo thứ tự ngược lại". Tôi nói rằng tôi muốn sắp xếp các phím theo thứ tự ngược lại, do đó phân loại các dict. Tôi nói "chìa khóa" để phân biệt với việc sắp xếp các hàng đợi/TValues, nhưng tôi hiểu được sự nhầm lẫn xuất phát từ đâu. Đã sửa đổi. – mpen

1

Tôi đã kết thúc việc chỉ thêm lớp này vào lớp học của mình, vì nó ngắn nhất và đơn giản nhất:

private class ReverseComparer : IComparer<TPriority> 
{ 
    public int Compare(TPriority x, TPriority y) { return y.CompareTo(x); } 
} 

Và sau đó khởi tạo dict như vậy:

dict = new SortedDictionary<TPriority, Queue<TValue>>(new ReverseComparer()); 
Các vấn đề liên quan