2012-07-12 14 views
8

mam List typu MyObject z definicją poniżej:LINQ Pierwsze unikalnych przedmiotów z listy obrębie listy

class MyObject { 
    public string ListName { get; set; } 
    public IEnumerable<OtherObject> ObjectList { get; set;} 
} 

otrzymał List typu MyObject, przy użyciu LINQ, co wyrażenie należy użyć, aby uzyskać wszystkie odrębne OtherObject?

Co planowałem zrobić, to zapętlić każdy MyObject i uzyskać odrębną OtherObject z właściwości ObjectList, ale wtedy muszę uzyskać wyraźne na całej liście.

Należy pamiętać, że jeżeli: MyObject[0].Objectlist[0] == 'ItemA' i MyObject[1].Objectlist[0] == 'ItemA' będzie jeszcze powrócić pojedynczej instancji ItemA. Ten kod jest tylko reprezentacją. W ten sposób nie mam dostępu do moich obiektów.

+0

http://stackoverflow.com/questions/1300088/distinct-with-lambda może to być coś, na co warto zwrócić uwagę. –

Odpowiedz

10

Można to osiągnąć po prostu za pomocą logiki Set. C# ma ładny realizację w formie HashSet:

var set = new HashSet<OtherObject>(myObjects.SelectMany(mo => mo.ObjectList)); 

lub jeśli wolisz odroczyć wykonanie, można wykorzystać metodę LINQ Distinct:

var distinct = myObjects.SelectMany(mo => mo.ObjectList).Distinct(); 
+0

Dziękujemy! Mam obiekt, który jest właściwością większego obiektu, który znajduje się na liście, która znajduje się na liście. Był w stanie uzyskać unikalną listę, wykonując 'data.SelectMany (d => d.Refs). Wybierz (r => r.MyObject) .Distinct()' co jest prostsze niż użycie '.ForEach()'. – jwatts1980

3

Jak o:

var l = new List<MyObject>(...); 
var unique = l.SelectMany(j => j.ObjectList).Distinct(); 

Możesz użyć tej techniki od Distinct() with lambda?, aby zmienić sposób, w jaki zdecydujesz, czy obiekt jest inny od innego.

Powiązane problemy