Jak za pomocą Linq uzyskać unikalną listę właściwości z listy obiektów?

171

Próbuję użyć Linq, aby zwrócić listę identyfikatorów, biorąc pod uwagę listę obiektów, w których identyfikator jest właściwością. Chciałbym móc to zrobić bez przeglądania każdego obiektu i wyciągania unikalnych identyfikatorów, które znajdę.

Mam listę obiektów typu MyClass, a jedną z właściwości tej klasy jest identyfikator.

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

Chcę tylko napisać zapytanie Linq, aby zwrócić mi listę tych identyfikatorów

Jak to zrobić, mając IList<MyClass>taki, że zwraca jeden IEnumerable<int>z identyfikatorów?

Jestem pewien, że musi istnieć możliwość zrobienia tego w jednym lub dwóch wierszach za pomocą Linq, zamiast przechodzenia przez każdy element na liście MyClass i dodawania unikalnych wartości do listy.

Każda pomoc w stworzeniu eleganckiego rozwiązania byłaby bardzo mile widziana!

mezoid
źródło
1
Zauważ również, że masz DistinctByw MoreLinq, który da ci różne opcjeMyClass na podstawie ID. Sposób użycia:var distincts = list.DistinctBy(x => x.ID);
nawfal

Odpowiedzi:

319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();
Marc Gravell
źródło
Łał! Myślałem, że to coś prostego ... Po prostu nie mogłem o tym myśleć. Wygląda na to, że będę musiał spędzić więcej czasu na zapoznawaniu się z Linq.
mezoid
29

Użyj operatora Distinct :

var idList = yourList.Select(x=> x.ID).Distinct();
CMS
źródło
5
(drugorzędny punkt nazywania; to nie jest "lista" identyfikatorów - to leniwie oceniany IEnumerable <int> - chyba że wywołasz .ToList (), oczywiście ;-p)
Marc Gravell
@Marc, prosta dwuwierszowa eksplikacja leniwego evala? Proszę i dziękuję: D
masfenix
2
@masfenix Lazy eval oznacza, że ​​operacja nie jest wykonywana, dopóki nie zostanie faktycznie użyta. W takim przypadku wybranie identyfikatorów i wybranie tylko odrębnych niekoniecznie jest wykonywane, gdy wykonywana jest instrukcja w tej odpowiedzi. Zostanie to zrobione, gdy faktycznie zaczniesz przechodzić przez idList, na przykład w pętli foreach.
Mark Meuer
13

Używając prostego Linq , z Distinct()rozszerzeniem:

var idList = (from x in yourList select x.ID).Distinct();
Dana
źródło
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);
        }

WYNIK

1234567890

Czarny Orzeł
źródło
1
Nie odpowiada na pytanie, a nawet jeśli tak, nie dodaje nic nowego.
nawfal
2

Biorąc Distinct, musimy również rzutować do IEnumerable. Jeśli lista jest wartością modelową, musisz napisać taki kod

 IEnumerable<T> ids = list.Select(x => x).Distinct();
Pergin Sheni
źródło