Подтвердить что ты не робот

ToList(). ForEach в Linq

Я новичок в Linq.

Я хочу установить два значения в инструкции foreach следующим образом

Мой фактический код - это

foreach (Employee emp in employees)
{
    foreach(Department dept in emp.Departments)
    {
        dept.SomeProperty = null;
    }
    collection.AddRange(emp.Departments);              
}

Небольшой рефакторинг превращает это в

foreach (Employee emp in employees)
{
    emp.Departments.ToList().ForEach(u => u.SomeProperty = null))
    collection.AddRange(emp.Departments);              
}

Но я хочу что-то вроде этого

employees.ToList().Foreach(collection.AddRange(emp.Departments),
emp.Departments.ToList().ForEach(u => u.SomeProperty = null))
4b9b3361

Ответ 1

Вы не должны использовать ForEach таким образом. Читать Lippert "ForEach" против "ForEach"

Если вы хотите быть жестокими с самим собой (и миром), по крайней мере, не создавайте бесполезных List

employees.All(p => {
    collection.AddRange(p.Departments);
    p.Departments.All(u => { u.SomeProperty = null; return true; } );
    return true;
});

Обратите внимание, что результат выражения All - это значение bool, которое мы отбрасываем (мы используем его только потому, что он "циклизирует" все элементы)

Повторю. Вы не должны использовать ForEach для изменения объектов. LINQ следует использовать "функциональным" способом (вы можете создавать новые объекты, но вы не можете изменять старые объекты и создавать побочные эффекты). И то, что вы пишете, создает так много бесполезных List только для получения двух строк кода...

Ответ 2

Как сказал xanatos, это неправильное использование ForEach.

Если вы собираетесь использовать linq для обработки этого, я бы сделал это следующим образом:

var departments = employees.SelectMany(x => x.Departments);
foreach (var item in departments)
{
    item.SomeProperty = null;
}
collection.AddRange(departments);

Однако подход Loop более читабельен и, следовательно, более удобен в обслуживании.

Ответ 3

employees.ToList().ForEach(
     emp=>
     {
          collection.AddRange(emp.Departments);
          emp.Departments.ToList().ForEach(u=>u.SomeProperty = null);
     });

Ответ 4

Попробуйте следующее:

foreach (var dept in employees.SelectMany(e => e.Departments))
{
   dept.SomeProperty = null;
   collection.Add(dept);
}

Ответ 5

employees.ToList().Foreach(u=> { u.SomeProperty = null; u.OtherProperty = null; });

Обратите внимание, что я использовал точки с запятой после каждого оператора набора то есть →

u.SomeProperty = null;
u.OtherProperty = null;

Надеюсь, это решит вашу проблему.

Ответ 6

вы хотите это?

    employees.ForEach(emp =>
    {
        collection.AddRange(emp.Departments.Where(dept => { dept.SomeProperty = null; return true; }));
    });

Ответ 7

Попробуйте использовать эту комбинацию лямбда-выражений:

employees.ToList.ForEach(emp => 
{
    collection.AddRange(emp.Departments);
    emp.Departments.ToList.ForEach(dept => dept.SomeProperty = null);                    
});