6
votes

Comment déterminer les doublons dans une collection d'INTS?

Disons que j'ai les valeurs suivantes dans une collection d'entiers: xxx

le résultat que je suis attendu est {5,7} . < / p>

Comment puis-je faire ça? Peut-être utiliser LINQ?

EDIT: La collection d'entrée est non formée, l'algorithme ne doit donc pas dépendre des doublons étant consécutifs. En outre, si la collection en double résultante est triée ou non pas d'importance.


1 commentaires

Si le tableau est non traduit, optez pour le hashset, sinon vous pouvez simplement comparer chaque élément avec le prochain.


7 Réponses :


1
votes

Utiliser hashset si vous êtes sur .NET 3.5, ou iesi.collections (NHibernate utilise ceci)


1 commentaires

Il ne joue pas bien avec des fournisseurs Linq comme Linq à SQL.



5
votes

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;
    }
}


4 commentaires

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".



1
votes

Linq avec groupe en comptant vous montrera comment faire un Groupe LINQ en comptant> 1

dans votre instance spécifique: xxx


0 commentaires

2
votes
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();

0 commentaires

2
votes

Essayez quelque chose comme ceci: xxx

de Rechercher des doublons à l'aide de Linq


0 commentaires

7
votes

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);


0 commentaires

2
votes
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();    

1 commentaires

Le distinct est superflu.