ToList().ForEach in Linq

本文关键字:in Linq ForEach ToList | 更新日期: 2023-09-27 18:11:43

我是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))
  

ToList().ForEach in Linq

您不应该以这种方式使用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,只为了获得两行代码。。。

正如xanatos所说,这是对ForEach的滥用。

如果你要使用linq来处理这个问题,我会这样做:

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

然而,循环方法可读性更强,因此更易于维护。

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

试试这个:

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

注意,我在每个set语句后面都使用了分号即-->

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

我希望这一定能解决你的问题。

您可以使用Array.ForEach()

Array.ForEach(employees, employee => {
   Array.ForEach(employee.Departments, department => department.SomeProperty = null);
   Collection.AddRange(employee.Departments);
});

你想要这个吗?

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

尝试使用Lambda表达式的组合:

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