2013-01-22 142 views
6

我想從四個深度的三個集合中選擇文本。需要一個LINQ來查詢嵌套集合的對象

RootObject具有List<ResourceSet>resourceSets

resourceSets具有List<Resources>resources

resources具有List<RouteLeg>routeLegs

routLegs具有List<ItineraryItem>itineraryItems

的每個routeLeg包含和名爲ItineraryItem的對象,並在該對象中有一個文本屬性。

我想拉出routeLeg對象上所有文本屬性的列表。正如你所看到的,它嵌套得很深。我顯然可以在嵌套循環中做到這一點(如下圖所示),但希望使用Linq to Objects來清理一些東西,但是我在多重嵌套時遇到了問題。

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

你有一個錯誤...'對(INT J = 0;Ĵ

回答

13

可以使用SelectMany來獲取內部項目:

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

真棒...謝謝里德..我的Linq生鏽:) –

+0

應該最後一行是sb .Append(item.instruction.ToString()); ? – pgee70