2017-05-25 31 views
0

我是linq查詢的新手。有沒有辦法將這些嵌套的foreach組合成一個linq查詢。如何將許多嵌套的foreachs合併成Linq查詢

如果沒有,在這種情況下是否有更好的方法來更新?

謝謝

List<Student> StudentList = new List<Student>(); 
    List<int> IDsList = new List<int>(); 


    foreach (var id in IDsList) 
    { 

     foreach (var st in StudentList.Where(a => a.StudentID == id)) 
     { 
      foreach (var cr in st.Courses) 
      { 
       cr.Projects.Where(b => string.IsNullOrEmpty(b.ProjectName) == true).ToList().ForEach(c => c.ProjectName = "Dummy"); 

      } 
     } 

    } 




public class Student 
{ 
    public string FirstName { get; set; } 
    public int StudentID { get; set; } 
    public List<course> Courses { get; set; } 

} 

public class course 
{ 
    public int CourseID { get; set; } 
    public string Description { get; set; } 
    public List<CourseProjects> Projects { get; set; } 
} 

public class CourseProjects 
{ 
    public string ProjectName { get; set; } 
    public int ProjectID { get; set; } 

} 
+0

你對Linq'ForEach'的使用表明你知道如何做到這一點的基礎知識,但是很難應用它,而不會無法閱讀你寫的和理解的東西/確信它的邏輯就是你的「試圖達到。這表明你不應該使用一系列ForEach lambda,因爲人的易讀性在編程和執行中同樣重要。如果你看不懂你寫的內容,你應該假設下一個人看到你的代碼不會。 – CDove

回答

3
foreach(var project in StudentList 
    .Where(a=>IDsList.Contains(a.StudentID)) 
    .SelectMany(b=>b.Courses) 
    .SelectMany(c=>c.Projects) 
    .Where(p=>string.IsNullOrEmpty(p.ProjectName))) 
{ 
    project.ProjectName = "Dummy"; 
} 
+0

並且更好地使'IDsList'' HashSet '而不是'List'。 – Evk

+0

如果沒有實現,這會不會崩潰?由於您在枚舉期間正在編輯項目名稱。 – user6144226

+0

@ user6144226不。我們沒有改變我們正在枚舉的集合的內容,我們正在改變我們列舉的內容的屬性。 –

1

你可以用替換的SelectMany每嵌套的foreach。

StudentList.Where(s => IDsList.Contains(s.StudentID)).SelectMany(f => f.Courses).SelectMany(p => p.Projects).Where(b => string.IsNullOrEmpty(b.ProjectName)).ToList(). 
      ForEach(c => c.ProjectName = "Dummy"); 

是否真的是一個更好的方式來更新列表仍有爭議。