2010-04-23 19 views
1

Je veux un IDictionary<float, foo> qui retourne les grandes valeurs de la clé en premier.C# .NET: Comparaison décroissante d'un SortedDictionary?

private IDictionary<float, foo> layers = new SortedDictionary<float, foo>(new DescendingComparer<float>()); 

class DescendingComparer<T> : IComparer<T> where T : IComparable<T> 
{ 
    public int Compare(T x, T y) 
    { 
     return -y.CompareTo(x); 
    } 
} 

Cependant, ceci renvoie des valeurs dans l'ordre du plus petit premier. J'ai l'impression de faire une erreur stupide ici.

Juste pour voir ce qui se passerait, je l'ai enlevé le signe - du comparateur:

public int Compare(T x, T y) 
    { 
     return y.CompareTo(x); 
    } 

Mais j'ai eu le même résultat. Cela renforce mon intuition que je fais une erreur stupide.

C'est le code qui accède au dictionnaire:

foreach (KeyValuePair<float, foo> kv in sortedLayers) 
{ 
    // ... 
} 

MISE À JOUR: Cela fonctionne, mais il est trop lent à appeler aussi souvent que je dois appeler cette méthode:

IOrderedEnumerable<KeyValuePair<float, foo>> sortedLayers = layers.OrderByDescending(kv => kv.Key); 
foreach (KeyValuePair<float, ICollection<IGameObjectController>> kv in sortedLayers) { 
    // ... 
} 

MISE À JOUR: Je mets un point de rupture dans le comparateur qui ne sera jamais atteint car j'ajoute et retire des paires de kv du dictionnaire. Qu'est-ce que cela pourrait signifier?

+2

Je pense que oui Vous confondez ascendant avec descendant. L'ascendant est 1 2 3 4 5 (la plus petite valeur en premier), la descente est 5 4 3 2 1 (la plus grande valeur en premier). – dtb

+0

@dtb vous avez raison. –

+0

'y.CompareTo (x)' devrait fonctionner par ordre décroissant. Pourquoi pas? : o Si vous donnez peu d'échantillons et de sortie, il sera plus facile à connaître. Voir [reverse-tried-dictionary-in-net] (http://stackoverflow.com/questions/931891/reverse-sorted-dictionary-in-net) – nawfal

Répondre

3

Pour ordre décroissant (valeurs les plus élevées en premier), vous feriez -x.CompareTo(y)

+0

@Rosarch: Ca devrait vraiment marcher, je sais que je l'ai déjà utilisé. Si vous déboguez votre code, trouvez-vous que votre méthode Compare est réellement appelée? –

+0

On dirait que ce n'est pas, en fait. Est-ce que je crée le 'SortedDictionary' incorrectement? –

+1

@Rosarch: Non, vous créez correctement le dictionnaire. Vérifiez que vous utilisez le dictionnaire que vous avez construit plus haut dans votre code lorsque vous ajoutez/supprimez des éléments et que vous les énumérez. C'EST À DIRE. Trouvez toutes les références 'layers' et assurez-vous qu'il n'y a pas un autre morceau de code assignant un' SortedDictionary' différent. –

0

essayer:

public int Compare(T x, T y) 
{ 
    return x.CompareTo(y); 
} 
+0

Cela ne fonctionne toujours pas. hmm .. –

0

Dans cette ligne, le commutateur x et y:

return -y.CompareTo(x); 

Make it

return -x.CompareTo(y);