Comment compter les doublons dans la liste avec LINQ

J’ai une liste d’articles

  • John ID
  • Matt ID
  • John ID
  • Scott ID
  • Matt ID
  • John ID
  • Lucas ID

Je veux les replacer dans une liste comme celle-ci, ce qui signifie également que je veux sortinger par le plus grand nombre de doublons.

  • John ID 3
  • Matt ID 2
  • Scott ID 1
  • Lucas ID 1

Faites-moi savoir comment je peux faire cela avec LINQ et C #.

Merci a tous

EDIT 2 Afficher le code:

List inventory = new List(); drinkingforDataContext db = new drinkingforDataContext(); foreach (ssortingng item in tbTitle.Text.Split(' ')) { List getItems = (from dfg in db.drinkingfor_Games where dfg.game_Name.Contains(tbTitle.Text) select new game { gameName = dfg.game_Name, gameID = Boomers.Utilities.Guids.Encoder.EncodeURLs(dfg.uid) }).ToList(); for (int i = 0; i < getItems.Count(); i++) { inventory.Add(getItems[i]); } } var items = (from xx in inventory group xx by xx into g let count = g.Count() orderby count descending select new { Count = count, gameName = g.Key.gameName, gameID = g.Key.gameID }); lvRelatedGames.DataSource = items; lvRelatedGames.DataBind(); 

Cette requête affiche ces résultats:

  • 1 heure mondiale
  • 1 heure mondiale
  • 1 Bonjour tout le monde.
  • 1 heure mondiale
  • 1 heure mondiale
  • 1 heure mondiale
  • 1 Bonjour tout le monde.
  • 1 heure mondiale

Cela me donne le compte et le nom, mais cela ne me donne pas l’identifiant du jeu ….

Il devrait afficher:

  • 6 bonjour les temps du monde 234234
  • 2 Bonjour tout le monde. 23432432

Vous pouvez utiliser “group by” + “orderby”. Voir LINQ 101 pour plus de détails

 var list = new List {"a", "b", "a", "c", "a", "b"}; var q = from x in list group x by x into g let count = g.Count() orderby count descending select new {Value = g.Key, Count = count}; foreach (var x in q) { Console.WriteLine("Value: " + x.Value + " Count: " + x.Count); } 

En réponse à ce message (maintenant supprimé):

Si vous avez une liste de certains objects personnalisés, vous devez utiliser un comparateur personnalisé ou un groupe par propriété spécifique.

La requête ne peut pas non plus afficher le résultat. Montrez-nous le code complet pour obtenir une meilleure aide.

Basé sur votre dernière mise à jour:

Vous avez cette ligne de code:

 group xx by xx into g 

Puisque xx est un object personnalisé, le système ne sait pas comment comparer un élément à un autre. Comme je l’ai déjà écrit, vous devez guider le compilateur et fournir certaines propriétés qui seront utilisées dans la comparaison d’objects ou fournir un comparateur personnalisé. Voici un exemple:

Notez que j’utilise Foo.Name comme clé – c.-à-d. Que les objects seront regroupés en fonction de la valeur de la propriété Name .

Il y a une erreur: vous traitez 2 objects en double en fonction de leur nom, mais qu’en est-il de l’ID? Dans mon exemple, je prends juste Id du premier object dans un groupe. Si vos objects ont des identifiants différents, cela peut poser problème.

 //Using extension methods var q = list.GroupBy(x => x.Name) .Select(x => new {Count = x.Count(), Name = x.Key, ID = x.First().ID}) .OrderByDescending(x => x.Count); //Using LINQ var q = from x in list group x by x.Name into g let count = g.Count() orderby count descending select new {Name = g.Key, Count = count, ID = g.First().ID}; foreach (var x in q) { Console.WriteLine("Count: " + x.Count + " Name: " + x.Name + " ID: " + x.ID); } 

Version légèrement plus courte en utilisant la chaîne de méthodes:

 var list = new List {"a", "b", "a", "c", "a", "b"}; var q = list.GroupBy(x => x) .Select(g => new {Value = g.Key, Count = g.Count()}) .OrderByDescending(x=>x.Count); foreach (var x in q) { Console.WriteLine("Value: " + x.Value + " Count: " + x.Count); } 

Vous pouvez aussi faire Dictionnaire:

  var list = new List { "a", "b", "a", "c", "a", "b" }; var result = list.GroupBy(x => x) .ToDictionary(y=>y.Key, y=>y.Count()) .OrderByDescending(z => z.Value); foreach (var x in result) { Console.WriteLine("Value: " + x.Key + " Count: " + x.Value); } 

Les autres solutions utilisent GroupBy . GroupBy est lent (il contient tous les éléments en mémoire) alors j’ai écrit ma propre méthode CountBy :

 public static Dictionary CountBy(this IEnumerable source, Func keySelector) { var countsByKey = new Dictionary(); foreach(var x in source) { var key = keySelector(x); if (!countsByKey.ContainsKey(key)) countsByKey[key] = 0; countsByKey[key] += 1; } return countsByKey; } 

Voici le programme complet s’il vous plaît vérifier ceci

 static void Main(ssortingng[] args) { List li = new List(); li.Add("Ram"); li.Add("shyam"); li.Add("Ram"); li.Add("Kumar"); li.Add("Kumar"); var x = from obj in li group obj by obj into g select new { Name = g.Key, Duplicatecount = g.Count() }; foreach(var m in x) { Console.WriteLine(m.Name + "--" + m.Duplicatecount); } Console.ReadLine(); }