C#-ToList()。Linq中的ForEach

我是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))
manav inder asked 2020-02-22T01:53:29Z
7个解决方案
65 votes

您不应该以这种方式使用ForEach。 阅读Lippert的“ foreach”与“ ForEach”

如果您想对自己(和整个世界)残忍,至少不要造成无用的ForEach

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

请注意,ForEach表达式的结果是我们要丢弃的List值(我们使用它只是因为它“循环”了所有元素)

我再说一遍。 您不应该使用ForEach更改对象。 LINQ应该以“功能性”方式使用(您可以创建新对象,但不能更改旧对象,也不能创建副作用)。 而且您编写的内容是创建了很多无用的List,而仅仅获得了两行代码...

xanatos answered 2020-02-22T01:53:56Z
17 votes

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

如果您要使用linq来处理此问题,我将这样做:

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

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

Charles Graham answered 2020-02-22T01:54:25Z
11 votes
employees.ToList().ForEach(
     emp=>
     {
          collection.AddRange(emp.Departments);
          emp.Departments.ToList().ForEach(u=>u.SomeProperty = null);
     });
artwl answered 2020-02-22T01:54:40Z
3 votes

尝试这个:

foreach (var dept in employees.SelectMany(e => e.Departments))
{
   dept.SomeProperty = null;
   collection.Add(dept);
}
Ilian answered 2020-02-22T01:55:00Z
2 votes
employees.ToList().Foreach(u=> { u.SomeProperty = null; u.OtherProperty = null; });

请注意,我在每个set语句后都使用了分号那是->

u.SomeProperty = null;
u.OtherProperty = null;

我希望这一定能解决您的问题。

Saurabh answered 2020-02-22T01:55:24Z
-3 votes

你要这个?

    employees.ForEach(emp =>
    {
        collection.AddRange(emp.Departments.Where(dept => { dept.SomeProperty = null; return true; }));
    });
ojlovecd answered 2020-02-22T01:55:44Z
-3 votes

尝试使用以下Lambda表达式组合:

employees.ToList.ForEach(emp => 
{
    collection.AddRange(emp.Departments);
    emp.Departments.ToList.ForEach(dept => dept.SomeProperty = null);                    
});
VS1 answered 2020-02-22T01:56:04Z
translate from https://stackoverflow.com:/questions/7816781/tolist-foreach-in-linq