C# 一次更新多个元素LINQ

C# 一次更新多个元素LINQ,c#,linq,C#,Linq,是否可以使用LINQ为列表中的每个元素设置属性 例如: var users = from u in context.Users where u.Name == "George" select u; foreach (User us in users){ us.MyProp = false; } 是否可以使其更干净?您可以创建自己的ForEach扩展方法: public static IEnumerable<T> ForEach<T>(this IEnumerab

是否可以使用LINQ为列表中的每个元素设置属性

例如:

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

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

是否可以使其更干净?

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

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

    return source;
}

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

如果您对内存更新感兴趣,即数据库不会更新,则可以使用

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

或者可以将其转换为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);
那么:

 context.Users.Where(u => u.Name == "George").Select(u => u.MyProp = false);
什么是清洁剂是相当主观的。就个人而言,我发现这种方法很难做到清晰和简单:

foreach (User us in users.Where(u => u.Name == "George"))
{
   us.MyProp = false;
}
看起来很脏,但如果被问到(只是通过选择),我会这样做

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

由于.Select()

之前的.ToList()不,LINQ和LINQ to SQL都没有基于集合的更新功能,因此上面的代码变得无法计算。您如何定义cleaner?更短的减少使用结构(包括索引)?您的方法中的代码行更少?不是应该是
context.Users.Where(x=>x.Name==“George”).ForEach(u=>u.MyProp=false)@Shiv:这是不对的
List
有一个
ForEach
方法,但
IEnumerable
没有。@Shiv IEnumerable没有,但List有ForEach方法。可以使用ToList。我唯一一次看到它是在它制作的时候parallel@Shiv:你能提供你的评论来源吗?我只是检查了一下,似乎没有找到这样的方法。事实上,我们在我们的框架中明确地创建了这样一个扩展@马纳瑟林,你的解决方案行不通,是吗?ForEach不是IEnumerable上的方法。我认为IEnumerable不包含ForEach方法。@Anuraj,错过了.ToList()。我已经更新了我的代码以包含查询部分,因此很清楚,我认为您也需要删除var-users声明。否则它将无法编译。您不能更改select中的值statement@Manatherin:理论上这是可以做到的,但与这个答案不同(而且没有真正意义)。+1但这将使IEnumerable延迟执行的好处无效,但我想这个功能会带来很多有趣的奇怪行为。只有在(!)@Johann Blais:是一本不错的读物时,才会修改这些对象。我写评论时就想到了这篇文章。确实是一本很好的书。:)您的ForEach语句中有一个错误
.ForEach({u=>
应该是
.ForEach(u=>{
这种方法会比循环ForEach循环中的每个元素并在循环中单独更新它们更好吗?@Niklas
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
    });