2009-03-16 12 views
27

Tengo un objeto de tipo A que consiste en una lista de objetos de tipo B:LINQ: Lista de listas a una larga lista

class A { list<B> Alist;} 
class B { string C; string D;} 

En mi programa tengo una lista de objetos A:

list<A> listOfA = computeAList(); 

y me gustaría seleccionar todos los C cadenas en esa lista. La siguiente declaración esperaba que me diera el resultado que quería; devuelve una lista de listas que contienen los C 's:

var query = from objectA in listOfA 
      select objectA.Alist.FindAll(x => x.C.Length > 0).C; 

¿Hay una manera de conseguir una lista única de todos los C' s en lugar?

Respuesta

46

La respuesta de ybo también habría sido mi primera respuesta. La expresión de consulta equivalente de esto es:

var query = from a in computeAList() 
      from b in a.Alist 
      select b.C; 

En aras de la exhaustividad, las otras respuestas en este hilo son variaciones sobre el mismo tema.

De YBO (la misma consulta exacta, expresada en notación de puntos):

var query = listOfA.SelectMany(a => a.Alist, (a, b) => b.C); 

De Ray Hayes (incluyendo la cláusula WHERE; he reformateado ligeramente):

var query = listOfA.SelectMany(a => a.AList, (a, b) => b.C) 
        .Where(c => c.Length > 0); 
+0

Eso era exactamente lo que estaba buscando. ¡Muchas gracias, Jon! – Chau

+0

@Jon, lo siento, no vi tu comentario. Ahora * usted * puede incluir la respuesta de Ray;). Gracias a ti y a Ray. – ybo

+0

He estado en esta respuesta unas 20 veces hasta el momento. No sé por qué no puedo recordar "selectmany" y siempre intento "seleccionar todo", pero siempre sucede. ¡Suerte esto está siempre a solo un google de distancia! – statue

14

yo también habría tenido una respuesta similar, mi única modificación fue agregar la cláusula where para evitar tener cadenas vacías (donde C está vacía):

listOfA.SelectMany(a => a.AList, (a, b) => b.C).Where(c => c.Length > 0);