J'ai un objet StringCollection avec 5 mots en eux. 3 d'entre eux sont des mots en double. J'essaie de créer une requête LINQ qui comptera combien de mots uniques sont dans la collection et les rendent à la console. Donc, par exemple, si mon stringcollection a une "maison", "voiture", "house", "chien", "chat", alors il devrait sortir comme ceci: aucune idée sur Comment créer une requête LINQ pour faire cela? P> P>
7 Réponses :
var xs = new StringCollection { "House", "Car", "House", "Dog", "Cat" }; foreach (var g in xs.Cast<string>() .GroupBy(x => x, StringComparer.CurrentCultureIgnoreCase)) { Console.WriteLine("{0}: {1}", g.Key, g.Count()); }
foreach(var g in input.GroupBy(i => i.ToLower()).Select(i => new {Word = i.Key, Count = i.Count()}) { Console.WriteLine(string.Format("{0} -> {1}", g.Word, g.Count)); }
Non! Utilisation de tolower pour la comparaison de chaîne insensible à casse == visagefalm.jpg
Il devrait être aussi simple que:
Console.WriteLine(stringCollection.Distinct().Count());
Cela montrera les chaînes uniques, mais pas le nombre de dupliqués.
Cela comptera le nombre de chaînes uniques. Donc, il retournerait 4 code>
@Ray & @matthew: Oui, l'OP a demandé comment compter combien de mots uniques il y a. Maintenant que l'exemple a été formaté, je me rends compte que ce n'est pas ce que l'OP avait l'intention de demander ...
Essayez le suivant
var res = from word in col.Cast<string>() group word by word into g select new { Word = g.Key, Count = g.Count() };
Je crois qu'un changement simple à le mot de groupe par Word.TObower () code> va réparer cela, bien sûr que toutes vos clés seront alors en minuscule.
Pour être juste sa réponse a probablement été écrite auparavant.
Quand j'essaie ceci, j'ai une erreur. N'oubliez pas que j'utilise un système System.Collections.Specialized.StringCollection pour stocker les chaînes, pas un tableau à chaîne
@icemanind J'ai changé ma réponse pour faire face à la collection faiblement dactylographiée.
@Taylor, ma réponse a été écrite avant que l'exigence de boîtier ait été ajoutée.
Étant donné que vous utilisez StringCollection et que vous souhaitez ignorer l'affaire, vous devez utiliser Enumérable.groupby avec Enumérable.Cast :
var results = collection.Cast<string>.GroupBy( i => i, (word, words) => new { Word = word, Count = words.Count() }, StringComparer.CurrentCultureIgnoreCase ); foreach(var wordPair in results) Console.WriteLine("Word: \"{0}\" - Count: {1}", wordPair.Word, wordPair.Count);
var query = from s in Collection group s by s.Description into g select new {word = g.Key, num = g.Count()};
Pour construire un seul résultat de la valeur de chaîne ...
var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" }; var result = stringCollection.Cast<string>().GroupBy( k => k, StringComparer.InvariantCultureIgnoreCase); foreach (var value in result) Console.WriteLine("{0} --> {1}", value.Key, value.Count());
Comment voulez-vous gérer le boîtier?
Ignorer l'affaire. Chat et chat devraient être traités comme le même mot
Toutes vos réponses sont grandes sauf que je ne semble pas avoir une méthode .Groupby. Gardez à l'esprit que j'utilise un système.Collections.Specialized.StringCollection pour stocker les chaînes, pas un tableau à chaîne.
Dupliqué possible de C #: une méthode pour compter les occurrences dans une liste a >