91 votes

Supprimer les objets avec une propriété en double de la liste

J'ai une liste d'objets en C#. Tous les objets contiennent un ID de propriété. Plusieurs objets ont la même propriété ID.

Comment puis-je rogner la liste (ou créer une nouvelle liste) où il n'y a qu'un seul objet par propriété d'ID ?

[Tous les doublons supplémentaires sont supprimés de la liste]

196voto

Daniel Mann Points 9146

Si vous voulez éviter d'utiliser une bibliothèque tierce, vous pouvez faire quelque chose comme :

 var bar = fooArray.GroupBy(x => x.Id).Select(x => x.First()).ToList();

Cela regroupera le tableau par la propriété Id, puis sélectionnera la première entrée du regroupement.

7voto

gdoron Points 61066
var list = GetListFromSomeWhere();
var list2 = GetListFromSomeWhere();
list.AddRange(list2);

....
...
var distinctedList = list.DistinctBy(x => x.ID).ToList();

More LINQ sur GitHub

Ou si vous ne souhaitez pas utiliser de dll externes pour une raison quelconque, vous pouvez utiliser cette surcharge Distinct

 public static IEnumerable<TSource> Distinct<TSource>(
    this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)

Usage:

 public class FooComparer : IEqualityComparer<Foo>
{
    // Products are equal if their names and product numbers are equal.
    public bool Equals(Foo x, Foo y)
    {

        //Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        return x.ID == y.ID
    }
}



list.Distinct(new FooComparer());

3voto

JScott Points 57

Je ne sais pas si quelqu'un cherche toujours d'autres moyens de le faire. Mais j'ai utilisé ce code pour supprimer les doublons d'une liste d'objets utilisateur en fonction des numéros d'identification correspondants.

 private ArrayList RemoveSearchDuplicates(ArrayList SearchResults)
{
    ArrayList TempList = new ArrayList();

    foreach (User u1 in SearchResults)
    {
        bool duplicatefound = false;
        foreach (User u2 in TempList)
            if (u1.ID == u2.ID)
                duplicatefound = true;

        if (!duplicatefound)
            TempList.Add(u1);
    }
    return TempList;
}

Appel : SearchResults = RemoveSearchDuplicates(SearchResults);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X