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))
您不应该以这种方式使用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);
});