有没有办法使用Linq执行以下操作:
foreach (var c in collection)
{
if (c.Condition == condition)
{
c.PropertyToSet = value;
// I must also check I only set this value to one minimum and only one element.
}
else
{
c.PropertyToSet = otherValue;
}
}
为了澄清,我想迭代集合中的每个对象,然后更新每个对象的属性,除了我的集合中应该更新为另一个值的一个元素。
此时我使用计数器来检查我将我的值设置为我的集合中的一个元素。我从这个例子中删除了它,让人们建议其他解决方案。
收集中的原始问题无一例外是here
修改
我问这个问题,因为我不确定是否可以使用LinQ。所以你的回答让我对LinQ有了一些看法。谢谢。
答案 0 :(得分:7)
您可以使用.ForEach
进行更改,.Single
只验证一个元素符合条件:
// make sure only one item matches the condition
var singleOne = collection.Single(c => c.Condition == condition);
singleOne.PropertyToSet = value;
// update the rest of the items
var theRest = collection.Where(c => c.Condition != condition);
theRest.ToList().ForEach(c => c.PropertyToSet = otherValue);
答案 1 :(得分:5)
我建议你不要与Linq一起实施。为什么?因为Linq用于查询,而不是用于修改。它可以返回符合某些条件的对象或不匹配的对象。但是,要更新这些对象,您仍需要使用foreach
或将查询结果转换为列表并使用ForEach
扩展名。两者都需要枚举序列两次。
因此,简单的循环将完成这项工作:
foreach (var c in collection)
{
c.PropertyToSet = (c.Condition == condition) ? value : otherValue;
}
答案 2 :(得分:2)
collection.Where(x => <condition>).ToList().ForEach(x => <action>);
答案 3 :(得分:2)
如果持久使用LINQ,则使用LINQ的方式:
var result = collection.Select(c =>
{
c.PropertyToSet = c.Condition == condition ? value : otherValue;
return c;
});
但是我的建议,不要这样做,你的代码实际上得到了最好的方法,为了更具可读性,你可以改变:
foreach (var c in collection)
c.PropertyToSet = c.Condition == condition ? value : otherValue;
答案 4 :(得分:2)
您可以将三元运算符与linq语句结合使用:
collection.ToList().ForEach(c => c.PropertyToSet = c.Condition == condition ? value : otherValue);
但是我只是在这里使用常规foreach来避免将集合转换为列表。
答案 5 :(得分:0)
嗯,你可以这样做:
var itemToSetValue = collection.FirstOrDefault(c => c.Condition == condition);
if(itemToSetValue != null)
itemToSetValue.PropertyToSet = value;
// Depending on what you mean, this predicate
// might be c => c != itemToSetValue instead.
foreach (var otherItem in collection.Where(c => c.Condition != condition))
{
otherItem.PropertyToSet = otherValue;
}
当然,这不是一个纯粹的LINQ解决方案,但纯LINQ解决方案不适合修改现有的集合。