Linq中的ToList().ForEach

man*_*der 49 c# linq entity-framework

我是Linq的新手.

我想在foreach语句中设置两个值,就像这样

我的实际代码就是这个

foreach (Employee emp in employees)
{
    foreach(Department dept in emp.Departments)
    {
        dept.SomeProperty = null;
    }
    collection.AddRange(emp.Departments);              
}
Run Code Online (Sandbox Code Playgroud)

少量重构将上述内容转化为此

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

但是我想要这样的东西

employees.ToList().Foreach(collection.AddRange(emp.Departments),
emp.Departments.ToList().ForEach(u => u.SomeProperty = null))
Run Code Online (Sandbox Code Playgroud)

xan*_*tos 65

你不应该这样使用ForEach.阅读Lippert的"foreach"与"ForEach"

如果你想对自己(和世界)残忍,至少不要创造无用的东西 List

employees.All(p => {
    collection.AddRange(p.Departments);
    p.Departments.All(u => { u.SomeProperty = null; return true; } );
    return true;
});
Run Code Online (Sandbox Code Playgroud)

请注意,All表达式的结果是bool我们要丢弃的值(我们只是因为它"循环"所有元素而使用它)

我再说一遍.您不应该使用ForEach更改对象.LINQ应该以"功能"方式使用(您可以创建新对象,但不能更改旧对象,也不能创建副作用).而你正在写的是List为了获得两行代码而创造了许多无用的东西......

  • 虽然我们在这里建议的是用'All`滥用来替换`ToList()'滥用.;) (20认同)
  • @IlianPinzon我以为我很清楚这一点.你认为我应该**大胆**吗?:-) (2认同)

Cha*_*ham 18

正如xanatos所说,这是对ForEach的误用.

如果您打算使用linq来处理这个问题,我会这样做:

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

但是,Loop方法更具可读性,因此更易于维护.

  • 删除`AddRange`行可能更好,它可以对序列进行不必要的额外遍历.可以在现有循环内部执行`collection.Add(item)`,结果相同. (3认同)

art*_*twl 11

employees.ToList().ForEach(
     emp=>
     {
          collection.AddRange(emp.Departments);
          emp.Departments.ToList().ForEach(u=>u.SomeProperty = null);
     });
Run Code Online (Sandbox Code Playgroud)


Ili*_*ian 5

尝试这个:

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