2012-07-12 46 views
8

Tengo un List de tipo MyObject con una definición más abajo:LINQ conseguir objetos únicos de una lista dentro de una lista

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

Dado un List de tipo MyObject, utilizando LINQ qué expresión debería utilizar para obtener todos distintos OtherObject?

Lo que estaba planeando hacer era recorrer cada MyObject y obtener el OtherObject distintivo de la propiedad ObjectList, pero luego tengo que hacer una distinción en la lista.

Tenga en cuenta que si: MyObject[0].Objectlist[0] == 'ItemA' y MyObject[1].Objectlist[0] == 'ItemA' seguirá siendo devolver una única instancia de ItemA. Este código es solo una representación. Esta no es la forma en que accedo a mis objetos, por cierto.

+0

http://stackoverflow.com/questions/1300088/distinct-with-lambda podría ser algo que vale la pena mirar. –

Respuesta

10

Puede lograr esto simplemente usando la lógica Set. C# tiene una buena aplicación en forma de HashSet:

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

o si lo prefiere aplazado la ejecución, puede utilizar el método de LINQ Distinct:

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

¡Gracias! Tengo un objeto que es propiedad de un objeto más grande, que está en una lista, que está en una lista. Pudo obtener una lista única haciendo 'data.SelectMany (d => d.Refs) .Select (r => r.MyObject) .Distinct()' que es mucho más simple que usar '.ForEach()'. – jwatts1980

3

¿Qué tal:

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

Puede usar la técnica de Distinct() with lambda? para modificar cómo decide si un objeto es distinto de otro.

Cuestiones relacionadas