C# 一次更新多个元素LINQ
是否可以使用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
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
});