5

有没有办法使用 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;
    }
}

为了澄清,我想遍历集合中的每个对象,然后更新每个对象的属性,但我的集合中的一个元素应该更新为另一个值。

此时,我使用计数器检查我将我的值设置为我收藏中的一个且只有一个元素。我从这个例子中删除了它,让人们提出其他解决方案。

收藏中无一例外的原始问题在这里

编辑

我问这个问题是因为我不确定是否可以用 LinQ 做到这一点。所以你的回答安慰了我对 LinQ 的看法。谢谢你。

4

6 回答 6

8

您可以使用.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);
于 2013-03-13T15:31:44.100 回答
6

我不建议你用 Linq 来实现这个。为什么?因为Linq是用来查询的,不是用来修改的。它可以返回匹配某些条件的对象或不匹配的对象。但是为了更新这些对象,您仍然需要使用foreach或将查询结果转换为列表并使用ForEach扩展名。两者都需要枚举序列两次

因此,简单的循环将完成这项工作:

foreach (var c in collection)
{
    c.PropertyToSet = (c.Condition == condition) ? value : otherValue;
}
于 2013-03-13T15:36:38.037 回答
2

如果您坚持使用,使用 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;
于 2013-03-13T15:40:22.063 回答
2

您可以将三元运算符与 linq 语句结合使用:

    collection.ToList().ForEach(c => c.PropertyToSet = c.Condition == condition ? value : otherValue);

但是,我在这里只使用常规的 foreach 来避免将集合转换为列表。

于 2013-03-13T15:40:34.170 回答
2
collection.Where(x => <condition>).ToList().ForEach(x => <action>);
于 2013-03-13T15:31:26.923 回答
1

好吧,你可以这样做:

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

于 2013-03-13T15:36:40.847 回答