2013-12-20 2 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 
Смежные вопросы