Dans .NET framework 3.5 et ci-dessus, vous pouvez utiliser Enumerable.GroupBy qui retourne une énumération de enumerables de doubles de clés, puis filtrer le tout de la enumerables qui ont un nombre de <=1, puis sélectionnez leurs touches à revenir vers le bas pour un seul énumérable:
var duplicateKeys =list.GroupBy(x => x).Where(group=>group.Count()>1).Select(group=>group.Key);
Cela donne toutes les lignes regroupées en fonction de leurs valeurs, pas de doublons... vous avez encore de filtrer par Count() > 1. Aussi, la façon dont je comprends la question, chaque ligne contient plusieurs mots, et l'OP veut le double de mots (mais peut-être que j'ai mal compris la question)
oui, le code n'est pas complet, c'est juste la première étape. Ensuite, il peut utiliser une Where si il veut juste les doublons, comme list.GroupBy(x => x).Where(group => group.Count() > 1).Select(group => Group.Key).ToList()
Si vous êtes à l'aide de LINQ, vous pouvez utiliser la requête suivante:
var duplicateItems =from x inlistgroup x by x into grouped
where grouped.Count()>1select grouped.Key;
ou, si vous préférez, sans sucre syntaxique:
var duplicateItems =list.GroupBy(x => x).Where(x => x.Count()>1).Select(x => x.Key);
Cette partie regroupe tous les éléments qui sont les mêmes, et les filtres à ceux des groupes avec plus d'un élément. Enfin, il sélectionne la clé de ces groupes que vous n'avez pas besoin de les compter.
Si vous préférez ne pas utiliser LINQ, vous pouvez utiliser cette méthode d'extension:
Ce garde la trace des éléments qu'il a vu et l'a donné. Si elle n'a pas vu un article avant, il l'ajoute à la liste de vu des éléments, sinon elle l'ignore. Si elle n'a pas abouti à un élément avant, il donne, sinon il l'ignore.
+1 pour HashSet. Je pense qu'en interne(à cause de la commande et des trucs) il effectue une recherche plus rapide.
PMSL @ 'sans sucre syntaxique'. C'est vraiment un autre nom pour LINQ Méthode de la syntaxe.
si vous n'avez pas besoin de suivre le itemsSeen puis la boucle peut être simplifié comme: foreach (T item in source) { if (!itemsYielded.Add(item)) { yield return item; } }
string[] ss ={"1","1","1"};var myList =newList<string>();var duplicates =newList<string>();foreach(var s in ss){if(!myList.Contains(s))
myList.Add(s);else
duplicates.Add(s);}//show list without duplicates foreach(var s in myList)Console.WriteLine(s);//show duplicates listforeach(var s in duplicates)Console.WriteLine(s);
pourquoi utiliser le var où l'on peut déclarer sans la surcharge?
À l'aide de LINQ, bien sûr.
Le code ci-dessous vous donnent dictionnaire de l'article comme une chaîne de caractères et le nombre de chaque élément dans votre sourc liste.
var item2ItemCount =list.GroupBy(item => item).ToDictionary(x=>x.Key,x=>x.Count());
Je suis en supposant que chaque chaîne dans votre liste contient plusieurs mots, laissez-moi savoir si c'est incorrect.
List<string>list=File.RealAllLines("foobar.txt").ToList();var words =from line inlistfrom word in line.Split(new[]{' ',';',',','.',':','(',')'},StringSplitOptions.RemoveEmptyEntries)select word;var duplicateWords =from w in words
group w by w.ToLower()into g
where g.Count()>1selectnew{Word= g.Key,Count= g.Count()}
Dans .NET framework 3.5 et ci-dessus, vous pouvez utiliser
Enumerable.GroupBy
qui retourne une énumération de enumerables de doubles de clés, puis filtrer le tout de la enumerables qui ont un nombre de <=1, puis sélectionnez leurs touches à revenir vers le bas pour un seul énumérable:Count() > 1
. Aussi, la façon dont je comprends la question, chaque ligne contient plusieurs mots, et l'OP veut le double de mots (mais peut-être que j'ai mal compris la question)Where
si il veut juste les doublons, commelist.GroupBy(x => x).Where(group => group.Count() > 1).Select(group => Group.Key).ToList()
Si vous êtes à l'aide de LINQ, vous pouvez utiliser la requête suivante:
ou, si vous préférez, sans sucre syntaxique:
Cette partie regroupe tous les éléments qui sont les mêmes, et les filtres à ceux des groupes avec plus d'un élément. Enfin, il sélectionne la clé de ces groupes que vous n'avez pas besoin de les compter.
Si vous préférez ne pas utiliser LINQ, vous pouvez utiliser cette méthode d'extension:
Ce garde la trace des éléments qu'il a vu et l'a donné. Si elle n'a pas vu un article avant, il l'ajoute à la liste de vu des éléments, sinon elle l'ignore. Si elle n'a pas abouti à un élément avant, il donne, sinon il l'ignore.
itemsSeen
puis la boucle peut être simplifié comme:foreach (T item in source) { if (!itemsYielded.Add(item)) { yield return item; } }
et sans LINQ:
var
.Si vous êtes à la recherche pour plus de méthode générique:
EDIT: Voici un exemple:
À l'aide de LINQ, bien sûr.
Le code ci-dessous vous donnent dictionnaire de l'article comme une chaîne de caractères et le nombre de chaque élément dans votre sourc liste.
Je suis en supposant que chaque chaîne dans votre liste contient plusieurs mots, laissez-moi savoir si c'est incorrect.
Pour ce que ça vaut, ici, c'est ma façon:
J'utilise une méthode similaire pour vérifier dupliqué entrys dans une chaîne de caractères:
C'est peut-être pas le plus court-circuit ou de manière élégante, mais je pense que c'est très lisible.