Comment utiliser Linq pour obtenir une liste unique de propriétés à partir d'une liste d'objets?

171

J'essaye d'utiliser Linq pour renvoyer une liste d'identifiants à partir d'une liste d'objets où l'identifiant est une propriété. J'aimerais pouvoir le faire sans parcourir chaque objet et extraire les identifiants uniques que je trouve.

J'ai une liste d'objets de type MyClass et l'une des propriétés de cette classe est un ID.

public class MyClass
{
  public int ID { get; set; }
}

Ce que je veux faire, c'est écrire une requête Linq pour me renvoyer une liste de ces identifiants

Comment puis-je faire cela étant donné IList<MyClass>que cela renvoie un IEnumerable<int>des identifiants?

Je suis sûr qu'il doit être possible de le faire en une ou deux lignes en utilisant Linq plutôt que de parcourir chaque élément de la liste MyClass et d'ajouter les valeurs uniques dans une liste.

Toute aide pour créer une solution élégante serait très appréciée!

mezoid
la source
1
Notez également que vous avez DistinctBydans MoreLinq qui vous donnera des MyClasss distincts basés sur ID. Utilisation:var distincts = list.DistinctBy(x => x.ID);
nawfal

Réponses:

319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();
Marc Gravell
la source
Hou la la! Je pensais que c'était quelque chose de simple ... Je ne pouvais tout simplement pas y penser. On dirait que je vais devoir passer plus de temps à me familiariser avec Linq.
mezoid
29

Utilisez l' opérateur Distinct :

var idList = yourList.Select(x=> x.ID).Distinct();
CMS
la source
5
(point de dénomination mineur; ce n'est pas une "liste" d'identifiants - c'est un IEnumerable <int> évalué paresseusement - sauf si vous appelez .ToList (), bien sûr ;-p)
Marc Gravell
@Marc, une simple explication en 2 lignes de lazy eval? Merci et merci: D
masfenix
2
@masfenix Lazy eval signifie que l'opération n'est pas effectuée tant qu'elle n'est pas réellement utilisée. Dans ce cas, la sélection des identifiants et le choix uniquement des identifiants distincts ne sont pas nécessairement effectués lorsque l'instruction de cette réponse est exécutée. Cela sera fait lorsque vous commencerez réellement à parcourir l'idList, par exemple dans une boucle foreach.
Mark Meuer
13

En utilisant Linq droit , avec l' Distinct()extension:

var idList = (from x in yourList select x.ID).Distinct();
Dana
la source
3
        int[] numbers = {1,2,3,4,5,3,6,4,7,8,9,1,0 };
        var nonRepeats = (from n in numbers select n).Distinct();


        foreach (var d in nonRepeats)
        {

            Response.Write(d);
        }

PRODUCTION

1234567890

Aigle Noir
la source
1
Ne répond pas à la question, et même si c'est le cas, n'ajoute rien de nouveau.
nawfal
2

Lorsque vous prenez Distinct, nous devons également lancer IEnumerable. Si la liste est un modèle, il faut écrire un code comme celui-ci

 IEnumerable<T> ids = list.Select(x => x).Distinct();
Pergin Sheni
la source