Linq: список списков в длинный список
У меня есть объект типа A
, который состоит из списка объектов типа B
:
class A { list<B> Alist;}
class B { string C; string D;}
В моей программе у меня есть список объектов A
:
list<A> listOfA = computeAList();
и я хотел бы выделить все строки C
в этом списке. Следующее выражение, которое я надеялся, даст мне результат, который я хотел; он возвращает список списков, содержащих C
's:
var query = from objectA in listOfA
select objectA.Alist.FindAll(x => x.C.Length > 0).C;
Есть ли способ получить единственный список всего C
вместо этого?
Ответы
Ответ 1
Ответ ybo был бы моим первым ответом. Выражение запроса эквивалентно этому:
var query = from a in computeAList()
from b in a.Alist
select b.C;
Для полноты, другие ответы в этом потоке являются вариантами одной и той же темы.
Из ybo (тот же самый запрос, выраженный в виде точечной нотации):
var query = listOfA.SelectMany(a => a.Alist, (a, b) => b.C);
От Ray Hayes (включая предложение Where, я немного переформатировал):
var query = listOfA.SelectMany(a => a.AList, (a, b) => b.C)
.Where(c => c.Length > 0);
Ответ 2
У меня тоже был бы аналогичный ответ, моя единственная модификация заключалась в том, чтобы добавить предложение where, чтобы избежать пустых строк (где C пуст):
listOfA.SelectMany( a => a.AList, (a, b) => b.C ).Where( c => c.Length > 0 );