Vous ne triez pas les entrées du dictionnaire. La classe de dictionnaire dans .NET est implémentée comme une table de hachage - cette structure de données n'est pas triable par définition.
Si vous devez pouvoir parcourir votre collection (par clé) - vous devez utiliser SortedDictionary, qui est implémenté comme un arbre de recherche binaire.
Dans votre cas, cependant, la structure source n'est pas pertinente, car elle est triée par un champ différent. Vous auriez encore besoin de le trier par fréquence et de le mettre dans une nouvelle collection triée par le champ pertinent (fréquence). Ainsi, dans cette collection, les fréquences sont des clés et les mots sont des valeurs. Étant donné que de nombreux mots peuvent avoir la même fréquence (et que vous allez l'utiliser comme clé), vous ne pouvez pas utiliser ni Dictionary ni SortedDictionary (ils nécessitent des clés uniques). Cela vous laisse avec une SortedList.
Je ne comprends pas pourquoi vous insistez pour maintenir un lien vers l'élément d'origine dans votre dictionnaire principal / premier.
Si les objets de votre collection avaient une structure plus complexe (plus de champs) et que vous deviez pouvoir y accéder / trier efficacement en utilisant plusieurs champs différents comme clés - Vous auriez probablement besoin d'une structure de données personnalisée qui consisterait en le stockage principal qui prend en charge l'insertion et la suppression de O (1) (LinkedList) et plusieurs structures d'indexation - Dictionnaires / SortedDictionaries / SortedLists. Ces index utiliseraient l'un des champs de votre classe complexe comme clé et un pointeur / référence vers LinkedListNode dans LinkedList comme valeur.
Vous auriez besoin de coordonner les insertions et les suppressions pour garder vos index synchronisés avec la collection principale (LinkedList) et les suppressions seraient assez chères, je pense. Ceci est similaire au fonctionnement des index de base de données - ils sont fantastiques pour les recherches mais ils deviennent un fardeau lorsque vous devez effectuer de nombreuses insertions et suppressions.
Tout ce qui précède n'est justifié que si vous allez effectuer un traitement lourd de recherche. Si vous n'avez besoin de les sortir qu'une fois triés par fréquence, vous pouvez simplement produire une liste de tuples (anonymes):
var dict = new SortedDictionary<string, int>();
// ToDo: populate dict
var output = dict.OrderBy(e => e.Value).Select(e => new {frequency = e.Value, word = e.Key}).ToList();
foreach (var entry in output)
{
Console.WriteLine("frequency:{0}, word: {1}",entry.frequency,entry.word);
}
IComparer
qui fait l'affaire (c'est vrai qu'il accepte une clé à comparer, mais avec une clé, vous pouvez obtenir une valeur). ;-)