2013-01-22 6 views
6

Sto provando a selezionare il testo da una raccolta profonda tre o quattro.È necessaria una query da linq a oggetti per una raccolta nidificata

RootObject ha un List<ResourceSet>resourceSets

Il resourceSets ha un List<Resources>resources

Il resources ha un List<RouteLeg>routeLegs

Il routLegs ha una List<ItineraryItem>itineraryItems

Il ogni routeLeg contiene e oggetto chiamato ItineraryItem e in quell'oggetto c'è una proprietà di testo.

Sto cercando di estrarre un elenco di tutte le proprietà del testo sull'oggetto routeLeg. Come puoi vedere, è annidato piuttosto in profondità. Ovviamente posso farlo nei loop annidati .. (come mostrato sotto) ma voglio qualcosa di più pulito usando Linq to Objects ma sto avendo problemi con il nesting multiplo.

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

Hai un bug ... 'for (int j = 0; j

risposta

13

È possibile utilizzare SelectMany per recuperare gli elementi interni:

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

Impressionante ... grazie Reed .. il mio Linq è arrugginito :) –

+0

dovrebbe l'ultima riga essere sb .Append (item.instruction.ToString()); ? – pgee70