是否可以使用LINQ从List中为每个元素设置属性。
例如:
var users = from u in context.Users where u.Name == "George" select u;
foreach (User us in users){
us.MyProp = false;
}
是否可以使其更清洁?
答案 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