Question Sort Dictionary (string, int) par valeur


Donc, fondamentalement, j'ai un problème avec la tâche qui m'a été confiée. Je ne vais pas vous ennuyer avec les détails de la tâche elle-même, alors je vais simplement vous donner les informations pertinentes.

J'ai un dictionnaire que je dois classer en fonction de la valeur int [valeur] la plus élevée, ainsi que des cinq valeurs les plus élevées pour être précis, et je dois aussi pouvoir afficher les cinq dernières.

Dictionary<string, int> dict = new Dictionary<string, int>();

Les chaînes (clés) contiennent des mots lus pour un fichier texte. Les ints (valeurs) contiennent le nombre de fois où ils ont été mentionnés dans le document.

J'allais le faire d'une autre manière, mais on m'a dit de le faire avec un dictionnaire, alors s'il vous plaît, aidez uniquement le dictionnaire. Je vous serais reconnaissant de bien vouloir expliquer comment cela doit être fait pour que je puisse apprendre et compléter la tâche car le but de la tâche est de me renseigner, mais je le trouve un peu difficile.

J'apprécie votre aide à l'avance, si plus d'informations sont nécessaires s'il vous plaît faites le moi savoir et je le posterai!


13
2018-01-28 16:33


origine


Réponses:


Les dictionnaires n'ont aucun ordre inhérent. Mais si vous voulez obtenir les 5 meilleures entrées avec les valeurs les plus élevées (ou les plus basses), vous pouvez utiliser un peu Linq:

using System.Linq;

...

var top5 = dict.OrderByDescending(pair => pair.Value).Take(5);
var bottom5 = dict.OrderBy(pair => pair.Value).Take(5);

Cela retournera un IEnumerable<KeyValuePair<string, int>>. Pour le remettre dans un dictionnaire, Linq peut à nouveau vous aider. Par exemple:

var top5 = dict.OrderByDescending(pair => pair.Value).Take(5)
               .ToDictionary(pair => pair.Key, pair => pair.Value);

À présent, top5 est un Dictionary<string, int> qui ne contient que les 5 éléments de dict avec la valeur la plus élevée.


29
2018-01-28 16:36



Vous devez obtenir le résultat de votre dictionnaire, puisque vous recherchez le Top 5, vous aurez besoin de Take comme:

//Top 5
foreach (var item in dict.OrderByDescending(r => r.Value).Take(5))
{
    Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
}

La raison pour laquelle vous avez besoin d'un OrderBy est parce que:

Dictionary<TKey, TValue> Class

Aux fins du dénombrement, chaque élément du dictionnaire est traité comme   une structure KeyValuePair représentant une valeur et ses   clé. L'ordre dans lequel les éléments sont renvoyés n'est pas défini.


4
2018-01-28 16:36



Si vous utilisez C # 3.0 et supérieur

Vous pouvez faire quelque chose comme ça avec LINQ 

foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value).Take(5))
{ 
    // do something with item.Key and item.Value
}

Si vous utilisez C # 2.0

List<KeyValuePair<string, string>> myList = aDictionary.ToList();

myList.Sort((firstPair,nextPair) =>
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);

ou il peut être réécrit comme

myList.Sort((x,y)=>x.Value.CompareTo(y.Value));

LINQ Cela permet une grande flexibilité dans la mesure où vous pouvez sélectionner les 10, 20, 10%, etc. supérieurs. Si vous utilisez l'index de fréquence des mots pour la saisie anticipée, vous pouvez également inclure la clause StartsWith.


3
2018-01-28 16:36