J’ai une liste d’articles
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.
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:
Cela me donne le compte et le nom, mais cela ne me donne pas l’identifiant du jeu ….
Il devrait afficher:
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(); }