ToList()。ForEach in Linq

我是Linq的新手。

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

我的实际代码是这样的

foreach (Employee emp in employees) { foreach(Department dept in emp.Departments) { dept.SomeProperty = null; } collection.AddRange(emp.Departments); } 

很less有重构把上面的东西变成了这个

 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”

如果你想对自己(和世界)残酷,至less不要创造无用的List

 employees.All(p => { collection.AddRange(p.Departments); p.Departments.All(u => { u.SomeProperty = null; return true; } ); return true; }); 

请注意, Allexpression式的结果是一个我们正在抛弃的bool值(我们使用它只是因为它“循环”了所有的元素)

我会重复。 您不应该使用ForEach来更改对象。 应以“function”方式使用LINQ(可以创build新对象,但不能更改旧对象,也不能创build副作用)。 而你正在写的是创造这么多无用的List只获得两行代码…

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

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

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

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

 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; 

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

你要这个?

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

尝试使用这种Lambdaexpression式的组合:

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