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
为了获得两行代码而创造了许多无用的东西......
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方法更具可读性,因此更易于维护.
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)
尝试这个:
foreach (var dept in employees.SelectMany(e => e.Departments))
{
dept.SomeProperty = null;
collection.Add(dept);
}
Run Code Online (Sandbox Code Playgroud)