Linq中的ToList()。ForEach

时间:2011-10-19 05:08:27

标签: c# linq entity-framework

我是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))

8 个答案:

答案 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);                    
});