2013-12-20 98 views
1

我不知道,如果它甚至可以做什麼,我想,但我想這一點,實在值得嘗試:)嵌套foreaches成鏈LINQ表達式

我可以結合這兩個嵌套foreaches?

foreach (var dept in curDevice.Personnel.Department.Company.Departments) 
{ 
    foreach (var personnel in dept.Personnels) 
    { 
     myPersonnels.Add(personnel); 
    } 
} 

我想將這個嵌套每個變成一個鏈式linq表達式。有可能嗎?如果是這樣如何?

+1

而下面會工作兩個答案將有助於如果我們知道myPersonnels是 – RoughPlace

+1

@Yakyb是的,我會想象它上面可能會有一個AddRange ... – Rawling

回答

2

這是工作人員的偏好(?看我做什麼有),但我喜歡函數式編程堅持如果這就是我開始用。

您可以使用方法替換foreach語言結構。

curDevice.Personnel.Department.Company.Departments 
    .SelectMany(department => department.Personnels) 
    .ToList() 
    .ForEach(personnel => myPersonnels.Add(personnel); 

通常情況下,我們會使用一個較短的參數名代表的發言:

curDevice.Personnel.Department.Company.Departments 
    .SelectMany(d => d.Personnels) 
    .ToList() 
    .ForEach(p => myPersonnels.Add(p); 

而且,如果myPersonnels僅是一個集合,你可以直接創建它:

var myPersonnels = curDevice.Personnel.Department.Company.Departments 
    .SelectMany(d => d.Personnels) 
    .ToList(); 

或者,如果它已經是List<T>,您可以添加一個IEnumerable<T>

myPersonnels.AddRange(
    curDevice.Personnel.Department.Company.Departments 
     .SelectMany(d => d.Personnels) 
); 
+0

我喜歡這個答案,因爲它在同一行也進行了添加操作。 –

+0

是的,我也是。 –

3

使用SelectMany<TSource, TResult>方法:

var allPersonnel = curDevice.Personnel.Department.Company.Departments.SelectMany(dept => dept.Personnels); 

// If there is no AddRange method: 
foreach (var personnel in allPersonnel) 
    myPersonnels.Add(personnel); 

// If there is an AddRange method: 
myPersonnels.AddRange(personnel) 
5

使用Enumerable.SelectMany

foreach (var personnel in 
curDevice.Personnel.Department.Company.Departments.SelectMany(x=> x.Personnels)) 
{ 
    myPersonnels.Add(personnel); 
} 
1

肯幾乎是正確的,但如果我是正確的myPersonnels列表是一個外部的,你想複製你的「查詢」的結果。前兩個答案是非常可讀的,但如果你想它不久的代碼,你可以這樣寫:

curDevice.Personnel.Department.Company.Departments 
    .SelectMany(x => x.Personnels) // selecting the personnels 
    .ToList() 
    .Foreach(myPersonnels.Add); // iterate trough the personnels list and copy them into the external list