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.
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.
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());
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();
myList.GroupBy(i => i.id).Select(group => group.First())