À l'aide de LINQ, à partir de a List<int>
, comment puis-je récupérer une liste contenant des entrées répétées plusieurs fois et leurs valeurs?
la source
À l'aide de LINQ, à partir de a List<int>
, comment puis-je récupérer une liste contenant des entrées répétées plusieurs fois et leurs valeurs?
Le moyen le plus simple de résoudre le problème consiste à regrouper les éléments en fonction de leur valeur, puis à choisir un représentant du groupe s'il existe plusieurs éléments dans le groupe. Dans LINQ, cela se traduit par:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => y.Key)
.ToList();
Si vous voulez savoir combien de fois les éléments sont répétés, vous pouvez utiliser:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => new { Element = y.Key, Counter = y.Count() })
.ToList();
Cela renverra un List
de type anonyme, et chaque élément aura les propriétés Element
et Counter
, pour récupérer les informations dont vous avez besoin.
Et enfin, si c'est un dictionnaire que vous recherchez, vous pouvez utiliser
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.ToDictionary(x => x.Key, y => y.Count());
Cela retournera un dictionnaire, avec votre élément comme clé, et le nombre de fois qu'il sera répété comme valeur.
code
for (int i = 0; i <duplicates.Count; i ++) {int duplicate = duplicates [i]; duplicatesLocation.Add (duplicate, new List <int> ()); for (int k = 0; k <hitsList.Length; k ++) {if (hitsList [k] .Contains (duplicate)) {duplicatesLocation.ElementAt (i) .Value.Add (k); }} // supprime les doublons selon certaines règles. }code
Découvrez si un énumérable contient des doublons :
Découvrez si toutes les valeurs d'un énumérable sont uniques :
la source
Une autre façon utilise
HashSet
:Si vous souhaitez des valeurs uniques dans votre liste de doublons:
Voici la même solution qu'une méthode d'extension générique:
la source
List<int> { 1, 2, 3, 4, 5, 2 }
comme source, le résultat est unIEnumerable<int>
avec un élément ayant la valeur1
(où la valeur en double correcte est 2)Console.WriteLine("Count: {0}", duplicates.Count());
directement en dessous et elle s'imprime6
. À moins que je manque quelque chose sur les exigences de cette fonction, il ne devrait y avoir qu'un seul élément dans la collection résultante.ToList
afin de résoudre le problème, mais cela signifie que la méthode est exécutée dès son appel, et non lorsque vous parcourez les résultats.var hash = new HashSet<int>();
var duplicates = list.Where(i => !hash.Add(i));
mènera à une liste qui inclut toutes les occurrences de doublons. Donc, si vous avez quatre occurrences de 2 dans votre liste, votre liste en double contiendra trois occurrences de 2, car une seule des 2 peut être ajoutée au HashSet. Si vous voulez que votre liste contienne des valeurs uniques pour chaque doublon, utilisez plutôt ce code:var duplicates = mylist.Where(item => !myhash.Add(item)).ToList().Distinct().ToList();
Tu peux le faire:
Avec ces méthodes d'extension:
L'utilisation de IsMultiple () dans la méthode Duplicates est plus rapide que Count () car cela n'itère pas toute la collection.
la source
Count()
est pré-calculée et que votre solution est probablement plus lente.Count()
] est fondamentalement différent de parcourir toute la liste.Count()
est pré-calculé mais l'itération de la liste entière ne l'est pas.J'ai créé une extension pour répondre à cela, vous pouvez l'inclure dans vos projets, je pense que cela revient le plus souvent lorsque vous recherchez des doublons dans List ou Linq.
Exemple:
la source
Pour rechercher uniquement les valeurs en double:
Par exemple. var list = new [] {1,2,3,1,4,2};
donc group by regroupera les nombres par leurs clés et maintiendra le compte (nombre de fois qu'il s'est répété) avec lui. Après cela, nous vérifions simplement les valeurs qui se sont répétées plus d'une fois.
Pour rechercher uniquement les valeurs uniuqe:
Par exemple. var list = new [] {1,2,3,1,4,2};
donc group by regroupera les nombres par leurs clés et maintiendra le compte (nombre de fois qu'il s'est répété) avec lui. Après cela, nous vérifions simplement les valeurs qui n'ont répété qu'une fois que les moyennes sont uniques.
la source
var unique = list.Distinct(x => x)
Ensemble complet d'extensions Linq to SQL des fonctions Duplicates vérifiées dans MS SQL Server. Sans utiliser .ToList () ou IEnumerable. Ces requêtes s'exécutent dans SQL Server plutôt qu'en mémoire. . Les résultats ne reviennent qu'en mémoire.
la source
il y a une réponse mais je n'ai pas compris pourquoi ne fonctionne pas;
ma solution est comme ça dans cette situation;
la source