web-dev-qa-db-fra.com

Sélectionnez distinct en utilisant linq

J'ai une liste de classe

public class LinqTest
{
public int id { get; set; }
public string value { get; set; }
}


List<LinqTest> myList = new List<LinqTest>();
myList.Add(new LinqTest() { id = 1, value = "a" });
myList.Add(new LinqTest() { id = 1, value = "b" });
myList.Add(new LinqTest() { id = 2, value = "c" });

Je dois sélectionner uniquement les identifiants distincts de cette liste. c'est-à-dire que ma liste résultante ne devrait contenir que

[{id=1,value="a"},{ id = 2, value = "c" }]

Comment puis-je faire cela avec linq?

Éditer

Contribution,

id      value
1        a
1        b
2        c
3        d
3        e

Out mis devrait être,

id      value
1        a
2        c
3        d

c'est-à-dire que s'il y a répétition de id, le résultat ne doit prendre que la première occurrence.

228
Anoop Joshi
myList.GroupBy(test => test.id)
      .Select(grp => grp.First());

Edit: comme obtenir ce IEnumerable<> dans un List<> semble être un mystère pour beaucoup de gens, vous pouvez simplement écrire:

var result = myList.GroupBy(test => test.id)
                   .Select(grp => grp.First())
                   .ToList();

Mais il est souvent préférable de travailler avec IEnumerable plutôt que IList comme le Linq ci-dessus est évalué paresseusement: il ne fait en fait tout le travail que lorsque l'énumérable est itéré. Lorsque vous appelez ToList, il défile tout l'énumérable, forçant tout le travail à être effectué à l'avance. (Et cela peut prendre un peu de temps si votre énumérable est infiniment long.)

Le revers de ce conseil est que chaque fois que vous énumérez une telle IEnumerable le travail pour l’évaluer doit être effectué à nouveau. Vous devez donc décider pour chaque cas s'il est préférable de travailler avec le IEnumerable paresseux évalué ou de le réaliser dans un List, Set, Dictionary ou autre chose.

471
Paul Ruane

En utilisant morelinq vous pouvez utiliser DistinctBy:

myList.DistinctBy(x => x.id);

Sinon, vous pouvez utiliser un groupe:

myList.GroupBy(x => x.id)
      .Select(g => g.First());
104
Daniel Hilgarth

Vous devez remplacer Equals et GetHashCode de manière significative, dans ce cas, comparez l'ID:

public class LinqTest
{
    public int id { get; set; }
    public string value { get; set; }

    public override bool Equals(object obj)
    {
        LinqTest obj2 = obj as LinqTest;
        if (obj2 == null) return false;
        return id == obj2.id;
    }

    public override int GetHashCode()
    {
        return id;
    }
}

Maintenant, vous pouvez utiliser Distinct:

List<LinqTest> uniqueIDs = myList.Distinct().ToList();
53
Tim Schmelter
myList.GroupBy(i => i.id).Select(group => group.First())
23
Tim Rogers