2016-06-14 10 views
1

私は、以下のような生徒のリストを持つ教師のリストを持つクラスのリスト(学校で)を持つ学校と呼ばれるC#クラスを持っています。私が必要とするのは、すべての教師のすべての学生名のカンマ区切りリストです。私はどのようにlinqでこれを達成することができますか?ここ は完全なコードです:ネストされたクラスでの結合によるCsharp linqの選択

class LinqTests 
{ 
    static void Main(string[] args) 
    { 
     Debug.WriteLine("*********************************************************************"); 

     School rw = new School(); 
     for (int j = 0; j < 2; j++) 
     { 
      ClassInSchool sr = new ClassInSchool(); 
      for (int i = 0; i < 2; i++) 
      { 
       sr.teachers.Add(new Teacher((i % 2), "" + i)); 
      } 
      rw.classes.Add(sr); 
     } 
     var elems = rw.classes.Select(sr => sr.teachers) 
      .Where(l2s => l2s != null) 
      .Where(l2s => l2s.Any(l2 => l2.include == true)); 

     Debug.WriteLine(JsonConvert.SerializeObject(elems, Formatting.None)); 

     Debug.WriteLine("*********************************************************************"); 
    } 


    class School 
    { 
     public List<ClassInSchool> classes; 
     public School() 
     { 
      classes = new List<ClassInSchool>(); 
     } 
    } 

    class ClassInSchool 
    { 
     public List<Teacher> teachers; 

     public ClassInSchool() 
     { 
      teachers = new List<Teacher>(); 
     } 
    } 

    class Teacher 
    { 
     public bool include; 
     public List<string> students; 
     public Teacher(int includeIn, string student) 
     { 
      include = Convert.ToBoolean(includeIn); 
      students = new List<string>(); 
      for (int i = 0; i < 3; i++) 
      { 
       students.Add(student + i); 
      } 
     } 
    } 
} 

答えて

1

あなたはその後、私はあなたが以下の

var students = rw.classes 
    .SelectMany(c => c.teachers) 
    .Where(t => t.include) 
    .SelectMany(t => t.students); 

をしたいと思う学生はカンマで区切られた文字列

var csv = string.Join(", ", students); 

を取得したい場合は、私が削除しましたnull コンストラクタで初期化するので、teachersのリストをチェックしてください。しかし、可能な限りnullのコレクションを守る必要がある場合は、代わりにこれを行うことができます。あなたはもちろん、それらのメソッドをチェーンでき

var students = rw.classes 
    .Where(c => c.teachers != null) 
    .SelectMany(c => c.teachers) 
    .Where(t => t.include && t.students != null) 
    .SelectMany(t => t.students); 
2
var teachers = rw.classes.Where(x => x.teachers != null) 
        .SelectMany(x => x.teachers.Where(teacher => teacher.students != null && teacher.include)); 
    var allStudentsNames = teachers.SelectMany(x => x.students); 
    var uniqueStudentsNames = allStudentsNames.Distinct(); 
    var uniqueStudentsNamesCommSeparatedList = string.Join(", ", uniqueStudentsNames); 

+1

故障のおかげで...戻り値をもっとよく理解するのに役立ちます。 – Kiran

関連する問題