Disons que j'ai les valeurs suivantes dans une collection d'entiers: le résultat que je suis attendu est Comment puis-je faire ça? Peut-être utiliser LINQ? P> {5,7} code>. < / p>
7 Réponses :
Utiliser hashset
Il ne joue pas bien avec des fournisseurs Linq comme Linq à SQL.
Que diriez-vous:
public static IEnumerable<T> OnlyDupes<T>(this IEnumerable<T> source) { var seen = new HashSet<T>(); foreach (var item in source) { // HashSet<T>.Add returns: true if the element is added to the // HashSet<T> object; false if the element is already present. if (!seen.Add(item)) yield return item; } }
Il ne joue pas bien avec des fournisseurs Linq comme Linq à SQL.
@Jason: Bon à savoir. Nous n'utilisons pas L2S dans notre magasin, donc je ne connais pas terriblement avec ses limitations.
C'est très bien. Il ne jouera pas bien avec des fournisseurs Linq qui travaillent sur une base de données; Il s'exécutera en mémoire au lieu de la base de données.
@Jason: évident une fois signalé :) Basé sur d'autres commentaires que je me demandais maintenant s'il les souhaite dans l'ordre ou même "Retour à des DuPes arrière seulement".
Linq avec groupe en comptant vous montrera comment faire un Groupe LINQ en comptant> 1
dans votre instance spécifique: p>
var list = new List<int>() { 1, 3, 4, 5, 5, 6, 7, 7 }; var duplicates = list.GroupBy(x => x) .Where(g => g.Count() > 1) .Select(g => g.Key) .ToList();
Essayez quelque chose comme ceci:
Vous pouvez le faire avec une fonctionnalité intégrée avec LINQ et fonctionne sur des fournisseurs LINQ tels que LINQ à SQL et EF et NHibernate:
var dups = collection.GroupBy(x => x) .Where(g => g.Count() > 1) .Select(g => g.Key);
var list = new List<int>(){1,3,4,5,5,6,7,7}; var query = ( from i in list group i by i into g where g.Count() > 1 select g.Key).ToList();
Le distinct code> est superflu.
Si le tableau est non traduit, optez pour le hashset, sinon vous pouvez simplement comparer chaque élément avec le prochain.