2017-07-28 17 views
0

を持つオブジェクトへのデータの行私は、この形式で提供されますいくつかのデータを持っている:子供や孫

+---------+---------+--------------+---------------------+ 
| Group 1 | Child 1 | Grandchild 1 | Greatgrandchild 1 | 
| Group 1 | Child 1 | Grandchild 1 | Greatgrandchild 2 | 
| Group 1 | Child 1 | Grandchild 2 | Greatgrandchild 3 | 
| Group 1 | Child 1 | Grandchild 2 | Greatgrandchild 4 | 
| Group 1 | Child 2 | Grandchild 3 | Greatgrandchild 5 | 
| Group 1 | Child 2 | Grandchild 3 | Greatgrandchild 6 | 
| Group 1 | Child 2 | Grandchild 3 | Greatgrandchild 7 | 
| Group 1 | Child 2 | Grandchild 4 | Greatgrandchild 8 | 
| Group 1 | Child 2 | Grandchild 4 | Greatgrandchild 9 | 
| Group 2 | Child 3 | Grandchild 5 | Greatgrandchild 10 | 
| Group 2 | Child 3 | Grandchild 5 | Greatgrandchild 11 | 
| Group 2 | Child 3 | Grandchild 6 | Greatgrandchild 12 | 
| Group 2 | Child 3 | Grandchild 6 | Greatgrandchild 13 | 
| Group 2 | Child 4 | Grandchild 7 | Greatgrandchild 14 | 
| Group 2 | Child 4 | Grandchild 7 | Greatgrandchild 15 | 
| Group 2 | Child 4 | Grandchild 8 | Greatgrandchild 16 | 
| Group 2 | Child 4 | Grandchild 8 | Greatgrandchild 17 | 
| Group 2 | Child 4 | Grandchild 8 | Greatgrandchild 18 | 
+---------+---------+--------------+---------------------+ 

と私はそれが子どもたちとPOCOSにそのデータを変換したい:

+-List<Group> 
    +-List<Child> 
    +-List<Grandchild> 
     +-List<Greatgrandchild> 

その後私はこのようなものを書くことができます:

foreach(var group in Groups) 
{ 
    foreach(var child in group.Childs) 
    { 
     foreach(var grandChild in child.GrandChilds) 
     { 
      foreach(var greatGrandChild in grandChild.GreatGrandChilds) 
      { 
      } 
     } 
    } 
} 

私はMVCを使用しており、これを達成するためにLINQを使用できると思います。

私はいくつかのGroupBy'ingを使用して、これをブルートフォースすることができました:

 var sb = new StringBuilder(); 

     foreach (var courses in query.GroupBy(c => c.courseInfo)) 
     { 
      foreach (var course in courses) 
      { 
       sb.AppendLine(course.courseInfo); 

       foreach (var semesters in courses.Where(c => c == course).GroupBy(s => s.semester_name)) 
       { 
        foreach (var semester in semesters) 
        { 
         sb.AppendLine(semester.semester_name); 

         foreach (var quizzes in semesters.Where(s => s == semester).GroupBy(q => q.quiz_name)) 
         { 
          foreach (var quiz in quizzes) 
          { 
           sb.AppendLine(quiz.quiz_name); 

           foreach (var student in quizzes.Where(q => q == quiz)) 
           { 
            sb.AppendLine(student.last_name); 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

     var results = sb.ToString(); 

私は上記のコードを使用して文字列を構築することができるよ、おそらく私のクラスを構築できますが、これは明らかです「良い」アプローチではありません。

+1

私もそうだと思います。たぶんあなたは何かを試してみることができますし、試行後にあなたが持っている疑問をお手伝いします。例えば、LINQのための['GroupBy()'](https://msdn.microsoft.com/en-us/library/system.linq.enumerable.groupby(v = vs.110).aspx)拡張メソッドがありますそれは助けになる可能性が高いです。 –

+0

@MikeMcCaughan私はGroupByと一緒に遊んでいましたが、foreachループがたくさんあるモンスターになってしまいました。 – Kevin

+0

あなたが物事で「遊んだ」なら、あなたはそれらの試みを示すべきです。そうでなければ、あなたは「少しの怪物」と考えられる回答を受け取るかもしれませんが、他の人は答えません。 –

答えて

4

これは、あなたが閉じてしまいます:取得するには

enter image description here

var data = new List<Data>() 
{ 
new Data(){Group="1", Child="1", Grandchild="1", Greatgrandchild="1"}, 
new Data(){Group="1", Child="1", Grandchild="1", Greatgrandchild="2"}, 
new Data(){Group="1", Child="1", Grandchild="2", Greatgrandchild="3"}, 
new Data(){Group="1", Child="1", Grandchild="2", Greatgrandchild="4"}, 
new Data(){Group="1", Child="2", Grandchild="3", Greatgrandchild="5"}, 
new Data(){Group="1", Child="2", Grandchild="3", Greatgrandchild="6"}, 
new Data(){Group="1", Child="2", Grandchild="4", Greatgrandchild="7"}, 
new Data(){Group="1", Child="2", Grandchild="4", Greatgrandchild="8"}, 
new Data(){Group="1", Child="2", Grandchild="5", Greatgrandchild="9"}, 
new Data(){Group="2", Child="3", Grandchild="5", Greatgrandchild="10"}, 
new Data(){Group="2", Child="3", Grandchild="6", Greatgrandchild="11"}, 
new Data(){Group="2", Child="3", Grandchild="6", Greatgrandchild="12"}, 
new Data(){Group="2", Child="3", Grandchild="7", Greatgrandchild="13"}, 
new Data(){Group="2", Child="4", Grandchild="7", Greatgrandchild="14"}, 
new Data(){Group="2", Child="4", Grandchild="8", Greatgrandchild="15"}, 
new Data(){Group="2", Child="4", Grandchild="8", Greatgrandchild="16"}, 
new Data(){Group="2", Child="4", Grandchild="9", Greatgrandchild="17"}, 
new Data(){Group="2", Child="4", Grandchild="9", Greatgrandchild="18"}, 
}; 

var result = data.GroupBy(d => d.Group).Select(d => new 
{ 
    Group = d.Key, 
    Childs = d.GroupBy(d2 => d2.Child).Select(d2 => new 
    { 
     Group = d2.Key, 
     GrandChilds = d2.GroupBy(d3 => d3.Grandchild).Select(d3 => new 
     { 
      Group = d3.Key, 
      GreatGrandchilds = d3.Select(d4 => d4.Greatgrandchild) 
     }) 
    }) 
}); 

は、この構造ではLINQPad結果(画像が収まるように、私は唯一の行の1つを拡大)での実行しますあなたが望むところまで、それぞれの "世代"を表すクラスを作成し、私の例のように新しい匿名型の代わりにそのクラスのインスタンスを返す必要があります。