是否有一种方法来做以下使用LINQ?

foreach (var c in collection)
{
    c.PropertyToSet = value;
}

为了澄清,我希望遍历集合中的每个对象,然后更新每个对象的属性。

我的用例是我在一篇博客文章上有一堆评论,我想迭代一篇博客文章上的每一条评论,并将博客文章上的datetime设置为+10小时。我可以用SQL来做,但我想把它保留在业务层。


当前回答

你可以使用Magiq,一个LINQ的批处理操作框架。

其他回答

我假设您希望在查询中更改值,以便为其编写函数

void DoStuff()
{
    Func<string, Foo, bool> test = (y, x) => { x.Bar = y; return true; };
    List<Foo> mylist = new List<Foo>();
    var v = from x in mylist
            where test("value", x)
            select x;
}

class Foo
{
    string Bar { get; set; }
}

但如果你是这个意思,那就不是舒坦了。

虽然你特别要求一个LINQ解决方案,这个问题很老了,但我发布了一个非LINQ解决方案。这是因为LINQ (= 语言集成查询)用于对集合进行查询。所有linq方法都不修改底层集合,它们只是返回一个新的集合(或者更准确地说是一个指向新集合的迭代器)。因此,无论你做什么,例如使用Select都不会影响底层集合,你只是获得一个新的集合。

当然,您可以使用ForEach(顺便说一下,这不是LINQ,而是List<T>上的扩展)。但是这里实际上使用了foreach,但是使用了lambda表达式。除此之外,每个LINQ方法都在内部迭代你的集合,例如通过使用foreach或for,然而它只是对客户端隐藏它。我不认为这更具可读性或可维护性(考虑在调试包含lambda-expressions的方法时编辑代码)。

说到这里,不应该使用LINQ来修改集合中的项目。更好的方法是你在问题中已经提供的解决方案。使用经典循环,您可以轻松迭代集合并更新其中的项目。事实上,所有这些解决方案都依赖于List。每一个都没有什么不同,但从我的角度来看很难理解。

所以你不应该在那些你想要更新集合元素的情况下使用LINQ。

我的2便士:-

 collection.Count(v => (v.PropertyToUpdate = newValue) == null);

你可以使用Magiq,一个LINQ的批处理操作框架。

实际上我找到了一个扩展方法,可以很好地完成我想要的

public static IEnumerable<T> ForEach<T>(
    this IEnumerable<T> source,
    Action<T> act)
{
    foreach (T element in source) act(element);
    return source;
}