C'est le genre de tâche pour laquelle LINQ est bien adapté.
Tout d'abord, nous allons définir ce que nous faisons:
- groupe les éléments de valeur
- Count chaque groupe
- Retour l'élément dont le groupe a le nombre le plus élevé
Cette requête implémente ce qui précède:
private string GetMostFrequent(IEnumerable<string> items)
{
var itemsOrderedByCount =
from item in items
group item by item into itemGroup
orderby itemGroup.Count() descending, itemGroup.Key
select itemGroup.Key;
return itemsOrderedByCount.FirstOrDefault();
}
La mise en œuvre se lit comme la description de haut niveau, un bel effet de bord de la syntaxe déclarative.Voici une explication rapide de chaque partie:
from item in items
est comme une déclaration de boucle; item
fait référence à la variable de boucle.
group item by item into itemGroup
Ceci place chaque item
dans un groupe en fonction de sa valeur. Ceci compte chaque groupe et les trie de sorte que le plus fréquent soit le premier. S'il y a deux groupes avec le même nombre, la valeur moindre est choisie. (Comme chaque groupe contient toutes les mêmes valeurs, la clé est l'élément compté.)
select itemGroup.Key
Cela dit que pour chaque groupe, nous voulons juste l'élément compté.
return itemsOrderedByCount.FirstOrDefault();
Ce saisit le premier élément de la liste ordonnée (celui avec le nombre le plus élevé). Si la séquence d'origine est vide, null est renvoyé.
Utilisation:
var items = new[] { "BOB", "JOHN", "TOM", "TOM", "TOM" };
Assert.AreEqual("TOM", GetMostFrequent(items));