Подтвердить что ты не робот

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 вместо этого?

4b9b3361

Ответ 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 );