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; });
请注意, All
expression式的结果是一个我们正在抛弃的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); });