使用Linq更新集合中除一个对象之外的所有对象

时间:2013-03-13 15:27:34

标签: c# .net linq

有没有办法使用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有了一些看法。谢谢。

6 个答案:

答案 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解决方案不适合修改现有的集合。