2013-01-22 27 views
6

Próbuję wybrać tekst z kolekcji, która ma trzy z czterech głębokości.Potrzebujesz zapytania linq do obiektu dla zagnieżdżonej kolekcji

RootObject ma List<ResourceSet>resourceSets

resourceSets ma List<Resources>resources

resources ma List<RouteLeg>routeLegs

routLegs ma List<ItineraryItem>itineraryItems

each routeLeg zawiera i obiekt o nazwie ItineraryItem iw tym obiekcie znajduje się właściwość tekstowa.

Próbuję wyciągnąć listę wszystkich właściwości tekstu na obiekcie routeLeg. Jak widać, jest zagnieżdżony dość głęboko. Mogę oczywiście zrobić to w zagnieżdżonych pętlach .. (jak pokazano poniżej), ale chcę czegoś czystszego używając Linq to Objects, ale mam problem z wielokrotnym zagnieżdżaniem.

ResourceSet testst = new ResourceSet(); 
      ResourceSet rs;   
      StringBuilder sb = new StringBuilder(); 

      for (int i = 0; i < _Result.resourceSets.Count; i++) 
      { 
       rs = _Result.resourceSets[i]; 


       for (int j = 0; j < rs.resources.Count; i++) 
       { 

        Resource rec = rs.resources[j]; 

        string test = rec.distanceUnit; 

        for (int k = 0; k < rec.routeLegs.Count; k++) 
        { 
         RouteLeg rl = rec.routeLegs[k]; 

         for (int l = 0; l < rl.itineraryItems.Count; l++) 
         { 
          ItineraryItem ii = rl.itineraryItems[l];       
          sb.Append(ii.instruction.ToString()); 
         } 
        } 

       } 
      } 
+0

masz błąd ... 'for (int j = 0; j

Odpowiedz

13

Można użyć SelectMany sprowadzić wewnętrzne elementy:

var items = result.resourceSets 
        .SelectMany(rs => rs.resources) 
        .SelectMany(res => res.routeLegs) 
        .SelectMany(rl => rl.itineraryItems) 
foreach(var x in items) 
    sb.Append(x.instruction.ToString()); 
+0

Awesome ... dzięki Reed .. mój Linq jest zardzewiały :) –

+0

powinien ostatnia linia być sb .Append (item.instruction.ToString()); ? – pgee70

Powiązane problemy