J’ai une liste de classe de classe
public class LinqTest { public int id { get; set; } public ssortingng value { get; set; } } List myList = new List(); 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?
modifier
Consortingbution,
id value 1 a 1 b 2 c 3 d 3 e
Out put devrait être,
id value 1 a 2 c 3 d
c’est-à-dire, s’il y a une répétition d’ id
, le résultat devrait prendre la première occurrence seulement.
myList.GroupBy(test => test.id) .Select(grp => grp.First());
Edit: comme il est mystérieux pour beaucoup de gens d’obtenir cet IEnumerable<>
dans une List<>
, 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 qu’avec IList
car le Linq ci-dessus est évalué paresseusement: il ne fait pas tout le travail tant que l’énumérable n’est pas itéré. Lorsque vous appelez ToList
il parcourt tout l’enableable en forçant tout le travail à se faire avant. (Et peut prendre un peu de temps si votre énumérable est infiniment long.)
Le revers de la médaille est que chaque fois que vous énumérez un tel IEnumerable
le travail d’évaluation doit être refait. Donc, vous devez décider pour chaque cas s’il est préférable de travailler avec le IEnumerable
évalué paresseusement ou de le réaliser dans une List
, un Set
, un 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
significative, dans ce cas, pour comparer l’ID:
public class LinqTest { public int id { get; set; } public ssortingng 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 uniqueIDs = myList.Distinct().ToList();
myList.GroupBy(i => i.id).Select(group => group.First())