Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linq: List of lists to a long list

Tags:

c#

linq

I've got an object of type A which consists of a list of objects of type B:

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

In my program I have a list of A objects:

list<A> listOfA = computeAList(); 

and I would like to select all the C strings in that list. The following statement I hoped would give me the result I wanted; it returns a list of lists containing the C's:

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

Is there a way to get a single list of all the C's instead?

like image 514
Chau Avatar asked Mar 16 '09 09:03

Chau


2 Answers

ybo's answer would have been my first response too. The query expression equivalent of this is:

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

For the sake of completeness, the other answers in this thread are variations on the same theme.

From ybo (the exact same query, expressed as dot notation):

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

From Ray Hayes (including the Where clause; I've reformatted slightly):

var query = listOfA.SelectMany(a => a.AList, (a, b) => b.C)                    .Where(c => c.Length > 0); 
like image 139
Jon Skeet Avatar answered Sep 24 '22 01:09

Jon Skeet


I too would have had a similar answer, my only modification was to add the where clause to avoid having empty strings (where C is empty):

listOfA.SelectMany( a => a.AList, (a, b) => b.C ).Where( c => c.Length > 0 ); 
like image 20
Ray Hayes Avatar answered Sep 24 '22 01:09

Ray Hayes