2012-07-12 9 views
8

Ho un List di tipo MyObject con una definizione di seguito:LINQ ottenere oggetti unici da un elenco all'interno di una lista

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

Dato un List di tipo MyObject, utilizzando LINQ quale espressione devo usare per ottenere tutti distinti OtherObject?

Quello che ho in mente di fare era ciclo ogni MyObject e ottenere la distinta OtherObject dalla proprietà ObjectList, ma poi ho bisogno di ottenere la distinta attraverso la lista.

Si prega di notare che se: MyObject[0].Objectlist[0] == 'ItemA' e MyObject[1].Objectlist[0] == 'ItemA' sarà ancora tornare una singola istanza di ItemA. Questo codice è solo una rappresentazione. A proposito, non è così che accedo ai miei oggetti.

+0

http://stackoverflow.com/questions/1300088/distinct-with-lambda potrebbe essere qualcosa che vale la pena guardare. –

risposta

10

È possibile ottenere ciò semplicemente utilizzando la logica Set. C# ha una bella esecuzione in forma di HashSet:

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

o, se preferite differita l'esecuzione, è possibile utilizzare il metodo LINQ Distinct:

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

Grazie! Ho un oggetto che è una proprietà di un oggetto più grande, cioè in una lista, che è in una lista. È stato possibile ottenere un elenco univoco eseguendo 'data.SelectMany (d => d.Refs) .Select (r => r.MyObject) .Distinct()' che è molto più semplice dell'uso di un file '.ForEach()'. – jwatts1980

3

ne dite:

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

È possibile utilizzare la tecnica da Distinct() with lambda? per modificare la modalità con cui si decide se un oggetto è distinto da un altro.

Problemi correlati