2010-05-06 9 views
8

Ich habe ein SortedDictionary als wie folgt definiert:Umgekehrtes sortiertes Wörterbuch?

SortedDictionary<TPriority, Queue<TValue>> dict; 

Aber ich will die dict in umgekehrter Reihenfolge halten. Ich nehme an, dass ich die Comparer einstellen muss, aber welchen Vergleich verwende ich für eine generische TPriority? Beachten Sie, dass TPriorityIComparable implementiert.

+0

möglich Duplikat [Rückwärts Sortiert Wörterbuch in .NET] (http://stackoverflow.com/questions/931891/reverse-sorted-dictionary-in -net) – nawfal

Antwort

16

Sie einen Reverse-Vergleich ganz einfach erstellen können

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

Beat mich bis zum Schlag. :-p – LBushkin

+0

Warum passier 'null' und dann checke es, wenn du in 'Comparer .Default' an erster Stelle hätte übergeben können? – mpen

+0

Schmackhafte Verwendung von "versiegelt", "readonly" und dem Null-Koaleszenz-Operator. –

1

Wenn Sie LINQ verwenden können, können Sie einfach tun:

dict.Keys.Reverse(); 

Dies ergibt den Schlüssel der Sammlung in umgekehrter Reihenfolge.

BEARBEITEN: Der Klasse SortedDictionary ist eine IComparer<T> zugeordnet, wenn sie konstruiert ist, und dies kann nicht nachträglich geändert werden. Sie können jedoch ein neues SortedDictionary<T> aus dem Original erstellen:

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); } 
} 

Nun, da passieren in den Konstruktor für das Wörterbuch:

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

Nun, ich meinte nicht, dass ich die Tasten in umgekehrter Reihenfolge haben wollte, ich wollte das Diktat in umgekehrter Reihenfolge beibehalten, so dass wenn ich darüber iteriere, es immer in absteigender Reihenfolge sein wird ... – mpen

+0

@Mark: Vielleicht hättest du dann nicht sagen sollen, dass du die Schlüssel in umgekehrter Reihenfolge haben wolltest. Sie sollten Ihre Frage bearbeiten, um sicherzustellen, dass sie für diejenigen, die in der Zukunft suchen, klar ist. –

+0

@Tom: Ich habe nicht gesagt, dass ich "die Schlüssel in umgekehrter Reihenfolge wollte". Ich sagte, ich wollte die Schlüssel in umgekehrter Reihenfolge sortieren und damit das Diktat sortieren. Ich sagte "Schlüssel" zu unterscheiden von der Sortierung der Warteschlangen/TValues, aber ich verstehe, wo die Verwirrung herkam. Geändert. – mpen

1

Ich habe es gerade zu meiner Klasse hinzugefügt, da es die kürzeste und einfachste ist:

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

Und dann initialisieren die dict wie so:

dict = new SortedDictionary<TPriority, Queue<TValue>>(new ReverseComparer()); 
Verwandte Themen