我是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))
答案 0 :(得分:61)
您不应该以这种方式使用ForEach
。阅读Lippert的“foreach” vs “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
只能获得两行代码......
答案 1 :(得分:16)
正如xanatos所说,这是对ForEach的误用。
如果您打算使用linq来处理这个问题,我会这样做:
var departments = employees.SelectMany(x => x.Departments);
foreach (var item in departments)
{
item.SomeProperty = null;
}
collection.AddRange(departments);
然而,Loop方法更具可读性,因此更易于维护。
答案 2 :(得分:10)
employees.ToList().ForEach(
emp=>
{
collection.AddRange(emp.Departments);
emp.Departments.ToList().ForEach(u=>u.SomeProperty = null);
});
答案 3 :(得分:3)
试试这个:
foreach (var dept in employees.SelectMany(e => e.Departments))
{
dept.SomeProperty = null;
collection.Add(dept);
}
答案 4 :(得分:2)
employees.ToList().Foreach(u=> { u.SomeProperty = null; u.OtherProperty = null; });
请注意,我在每个set语句后都使用了分号
那是 - >
u.SomeProperty = null;
u.OtherProperty = null;
我希望这肯定会解决你的问题。
答案 5 :(得分:0)
您可以使用Array.ForEach()
Array.ForEach(employees, employee => {
Array.ForEach(employee.Departments, department => department.SomeProperty = null);
Collection.AddRange(employee.Departments);
});
答案 6 :(得分:-3)
employees.ForEach(emp =>
{
collection.AddRange(emp.Departments.Where(dept => { dept.SomeProperty = null; return true; }));
});
答案 7 :(得分:-3)
尝试使用Lambda表达式的这种组合:
employees.ToList.ForEach(emp =>
{
collection.AddRange(emp.Departments);
emp.Departments.ToList.ForEach(dept => dept.SomeProperty = null);
});