Wie verwende ich Linq, um eine eindeutige Liste von Eigenschaften aus einer Liste von Objekten zu erhalten?

171

Ich versuche, Linq zu verwenden, um eine Liste von IDs mit einer Liste von Objekten zurückzugeben, bei denen die ID eine Eigenschaft ist. Ich möchte dies tun können, ohne jedes Objekt zu durchlaufen und die eindeutigen IDs herauszuholen, die ich finde.

Ich habe eine Liste von Objekten vom Typ MyClass und eine der Eigenschaften dieser Klasse ist eine ID.

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

Ich möchte eine Linq-Abfrage schreiben, um mir eine Liste dieser IDs zurückzugeben

Wie mache ich das, wenn es IList<MyClass>so ist, dass es eine IEnumerable<int>der IDs zurückgibt ?

Ich bin sicher, dass es möglich sein muss, dies mit Linq in ein oder zwei Zeilen zu tun, anstatt jedes Element in der MyClass-Liste zu durchlaufen und die eindeutigen Werte einer Liste hinzuzufügen.

Jede Hilfe bei der Erstellung einer eleganten Lösung wäre sehr dankbar!

Mezoid
quelle
1
Beachten Sie auch, dass Sie DistinctByin MoreLinq haben, das Ihnen eindeutige MyClasss basierend auf gibt ID. Verwendung:var distincts = list.DistinctBy(x => x.ID);
Nawfal

Antworten:

319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();
Marc Gravell
quelle
Beeindruckend! Ich dachte, es wäre etwas Einfaches ... ich konnte einfach nicht daran denken. Sieht so aus, als müsste ich noch etwas Zeit damit verbringen, mich mit Linq vertraut zu machen.
Mezoid
29

Verwenden Sie den Distinct-Operator :

var idList = yourList.Select(x=> x.ID).Distinct();
CMS
quelle
5
(kleiner Namenspunkt; es ist keine "Liste" von IDs - es ist eine träge ausgewertete IEnumerable <int> - es sei denn, Sie rufen natürlich .ToList () auf ;-p)
Marc Gravell
@Marc, eine einfache 2-Zeilen-Explantation von Lazy Eval? Bitte und danke: D
masfenix
2
@masfenix Lazy eval bedeutet, dass der Vorgang erst ausgeführt wird, wenn er tatsächlich verwendet wird. In diesem Fall erfolgt die Auswahl der IDs und nur die Auswahl der eindeutigen IDs nicht unbedingt, wenn die Anweisung in dieser Antwort ausgeführt wird. Dies geschieht, wenn Sie tatsächlich beginnen, die idList zu durchlaufen, beispielsweise in einer foreach-Schleife.
Mark Meuer
13

Verwenden Sie Straight Linq mit der Distinct()Erweiterung:

var idList = (from x in yourList select x.ID).Distinct();
Dana
quelle
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);
        }

AUSGABE

1234567890

Schwarzer Adler
quelle
1
Beantwortet die Frage nicht und fügt selbst dann nichts Neues hinzu.
Nawfal
2

Wenn wir Distinct nehmen, müssen wir auch IEnumerable verwenden. Wenn Liste Modell bedeutet, müssen Sie Code wie diesen schreiben

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