LINQ一次更新多个元素

时间:2011-03-02 09:12:53

标签: c# linq

是否可以使用LINQ从List中为每个元素设置属性。

例如:

var users = from u in context.Users where u.Name == "George" select u;

foreach (User us in users){
   us.MyProp = false;
}

是否可以使其更清洁?

6 个答案:

答案 0 :(得分:57)

或者您可以将其转换为ToList()并使用ForEach方法。

users.ToList().ForEach(u => u.MyProp = false);

更新多个属性

users.ToList().ForEach(u =>
                      {
                         u.property1 = value1;
                         u.property2 = value2;
                      });

或者像这样

(from u in context.Users where u.Name == "George" select u).ToList()
.ForEach(u => u.MyProp = false);

答案 1 :(得分:3)

您可以创建自己的ForEach扩展方法:

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach (var element in source)
    {
        action(element);
    }

    return source;
}

然后您的代码可以简化为:

context.Users.Where(x => x.Name == "George").ForEach(u => u.MyProp = false);

编辑:您还可以在调用action()之后返回每个项目(没有双关语),以使延迟执行保持不变。

答案 2 :(得分:2)

什么是清洁工是非常主观的。就个人而言,我觉得这种方法很难明白和简单:

foreach (User us in users.Where(u => u.Name == "George"))
{
   us.MyProp = false;
}

答案 3 :(得分:1)

如果您对内存更新感兴趣,那就是数据库不会更新,那么您可以使用

var users = (from u in context.Users where u.Name == "George" select u).ToList();
users.ForEach(u => u.MyProp = "Something");

答案 4 :(得分:0)

怎么样:

 context.Users.Where(u => u.Name == "George").Select(u => u.MyProp = false);

答案 5 :(得分:0)

看起来很脏,但如果被问到(只是通过选择),我会这样做

var users = from u in context.Users where u.Name == "George" 
select new User() 
{
   prop1 = u.prop1,
   prop2 = u.prop2,
   prop3 = true // update like here
};

如果你想使用其他一些C#函数,你也可以使用linq函数并处理IEnumerable类型的列表。

var users = context.Users.Where(u => u.Name == "George").ToList()
    .Select(p => new User() 
    {
       prop1 = p.prop1,
       prop2 = p.prop2,
       prop3 = ComputeHash(p) // update like here
    });

由于.ToList()

之前的.Select(),上面的代码变为IEnumerable