List<int> a = new List<int>{ 1,1,2,2,3,4,5 };
Quelle est la manière la plus rapide de faire cela avec LINQ?Trouvez les nombres les plus fréquents dans un tableau en utilisant LINQ
Je suis nouveau à LINQ
List<int> a = new List<int>{ 1,1,2,2,3,4,5 };
Quelle est la manière la plus rapide de faire cela avec LINQ?Trouvez les nombres les plus fréquents dans un tableau en utilisant LINQ
Je suis nouveau à LINQ
La clé est ici en utilisant Enumerable.GroupBy
et la méthode d'agrégation Enumerable.Count
:
List<int> list = new List<int>() { 1,1,2,2,3,4,5 };
// group by value and count frequency
var query = from i in list
group i by i into g
select new {g.Key, Count = g.Count()};
// compute the maximum frequency
int whatsTheFrequencyKenneth = query.Max(g => g.Count);
// find the values with that frequency
IEnumerable<int> modes = query
.Where(g => g.Count == whatsTheFrequencyKenneth)
.Select(g => g.Key);
// dump to console
foreach(var mode in modes) {
Console.WriteLine(mode);
}
+1 pour le nom de la variable –
Merci, juste m'a aidé sur le même problème –
Notez que cela peut exploser lorsque la liste d'entrée est vide. Cela peut ou peut ne pas être désiré. De plus, ne répétez-vous pas deux fois la requête? un pour 'Max' et un pour la sélection finale? – nawfal
from num in a
group num by num into numg
let c = numg.Count()
order by c descending
select new { Number = numg.Key, Count = c }
Cela ne se commande que par fréquence et calcule la fréquence. Cependant, il ne trouve pas le ou les éléments qui se sont le plus produits. – jason
La réponse de Jason est correct, mais vous pouvez effectuer cette opération dans un LINQ opération.
List<int> list = new List<int>() { 1, 1, 2, 2, 3, 4, 5 };
// return most frequently occurring items
var query = from i in list
group i by i into g
let maxFreq = (from i2 in list
group i2 by i2 into g2
orderby g2.Count() descending
select g2.Count()).First()
let gCount = g.Count()
where gCount == maxFreq
select g.Key;
// dump to console
foreach (var mode in query)
{
Console.WriteLine(mode);
}
Je pense que le nombre le plus fréquent peut également être réalisé en une seule requête comme this-
var query = (from i in list
group i by i into g
orderby g.Count() descending
select new { Key = g.Key, Count = g.Count() }).FirstOrDefault();
if (query == null) Console.WriteLine("query = NULL");
else Console.WriteLine("The number '{0}' occurs {1} times.", query.Key, query.Count);
chèque nul n'est pas vraiment nécessaire, mais il peut être utile lorsque nulle est effectivement prévu (comme vide liste)
Cette méthode n'attrape pas les listes comportant plusieurs éléments ayant la fréquence la plus élevée. – jason
public static Tres MostCommon<Tsrc, Tres>(this IEnumerable<Tsrc> source, Func<Tsrc, Tres> transform)
{
return source.GroupBy(s => transform(s)).OrderByDescending(g => g.Count()).First().Key;
}
Et dans votre exemple avec des types intégrés vous pouvez l'appeler comme:
List<int> a = new List<int>{ 1,1,2,2,3,4,5 };
int mostCommon = a.MostCommon(x => x);
la sortie devrait être 1, 2 –
Je vous ai fourni une solution qui produit ce résultat. – jason