2013-01-22 11 views
6

4つのうちの3つのコレクションからテキストを選択しようとしています。ネストされたコレクションのオブジェクト照会にlinqが必要

RootObjectList<ResourceSet>resourceSets

resourceSetsList<Resources>resources

resourcesList<RouteLeg>routeLegs

routLegsList<ItineraryItem>itineraryItems

ザを有し有する有している各routeLegにはItineraryItemという名前のオブジェクトが含まれ、そのオブジェクトにはテキストプロパティがあります。

routeLegオブジェクトのすべてのテキストプロパティのリストを作成しようとしています。あなたが見ることができるように、それはかなり深くネストされています。私は明らかにネストされたループでこれを行うことができます..(下に示されているように)しかし、クリーナーオブジェクトにLinqを使用したいが、私は複数の入れ子に問題があります。

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; jの

答えて

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

関連する問題