ToList (). ForEach в Linq - PullRequest
       4

ToList (). ForEach в Linq

47 голосов
/ 19 октября 2011

Я новичок в 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))

Ответы [ 7 ]

62 голосов
/ 19 октября 2011

Вы не должны использовать ForEach таким образом. Прочитайте «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 только для того, чтобы получить две строки кода ...

16 голосов
/ 19 октября 2011

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

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

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

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

10 голосов
/ 19 октября 2011
employees.ToList().ForEach(
     emp=>
     {
          collection.AddRange(emp.Departments);
          emp.Departments.ToList().ForEach(u=>u.SomeProperty = null);
     });
3 голосов
/ 19 октября 2011

Попробуйте это:

foreach (var dept in employees.SelectMany(e => e.Departments))
{
   dept.SomeProperty = null;
   collection.Add(dept);
}
2 голосов
/ 25 ноября 2014
employees.ToList().Foreach(u=> { u.SomeProperty = null; u.OtherProperty = null; });

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

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

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

0 голосов
/ 19 октября 2011

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

employees.ToList.ForEach(emp => 
{
    collection.AddRange(emp.Departments);
    emp.Departments.ToList.ForEach(dept => dept.SomeProperty = null);                    
});
0 голосов
/ 19 октября 2011

ты хочешь этого?

    employees.ForEach(emp =>
    {
        collection.AddRange(emp.Departments.Where(dept => { dept.SomeProperty = null; return true; }));
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...