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

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

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

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


当前回答

我已经尝试了一些变化,我一直回到这个家伙的解。

http://www.hookedonlinq.com/UpdateOperator.ashx

同样,这是别人的解。但我已经将代码编译成一个小库,并经常使用它。

我将把他的代码粘贴在这里,以防他的网站(博客)在未来的某个时候不复存在。(没有什么比看到一个帖子说“这是你需要的确切答案”更糟糕的了,点击,然后是死网址。)

    public static class UpdateExtensions {

    public delegate void Func<TArg0>(TArg0 element);

    /// <summary>
    /// Executes an Update statement block on all elements in an IEnumerable<T> sequence.
    /// </summary>
    /// <typeparam name="TSource">The source element type.</typeparam>
    /// <param name="source">The source sequence.</param>
    /// <param name="update">The update statement to execute for each element.</param>
    /// <returns>The numer of records affected.</returns>
    public static int Update<TSource>(this IEnumerable<TSource> source, Func<TSource> update)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (update == null) throw new ArgumentNullException("update");
        if (typeof(TSource).IsValueType)
            throw new NotSupportedException("value type elements are not supported by update.");

        int count = 0;
        foreach (TSource element in source)
        {
            update(element);
            count++;
        }
        return count;
    }
}



int count = drawingObjects
        .Where(d => d.IsSelected && d.Color == Colors.Blue)
        .Update(e => { e.Color = Color.Red; e.Selected = false; } );

其他回答

我的2便士:-

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

我已经尝试了一些变化,我一直回到这个家伙的解。

http://www.hookedonlinq.com/UpdateOperator.ashx

同样,这是别人的解。但我已经将代码编译成一个小库,并经常使用它。

我将把他的代码粘贴在这里,以防他的网站(博客)在未来的某个时候不复存在。(没有什么比看到一个帖子说“这是你需要的确切答案”更糟糕的了,点击,然后是死网址。)

    public static class UpdateExtensions {

    public delegate void Func<TArg0>(TArg0 element);

    /// <summary>
    /// Executes an Update statement block on all elements in an IEnumerable<T> sequence.
    /// </summary>
    /// <typeparam name="TSource">The source element type.</typeparam>
    /// <param name="source">The source sequence.</param>
    /// <param name="update">The update statement to execute for each element.</param>
    /// <returns>The numer of records affected.</returns>
    public static int Update<TSource>(this IEnumerable<TSource> source, Func<TSource> update)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (update == null) throw new ArgumentNullException("update");
        if (typeof(TSource).IsValueType)
            throw new NotSupportedException("value type elements are not supported by update.");

        int count = 0;
        foreach (TSource element in source)
        {
            update(element);
            count++;
        }
        return count;
    }
}



int count = drawingObjects
        .Where(d => d.IsSelected && d.Color == Colors.Blue)
        .Update(e => { e.Color = Color.Red; e.Selected = false; } );

有些人认为这是一种评论,但对我来说是一种回答,因为做错事的正确方法是不去做。所以,这个问题的答案就在问题本身。

不要使用LINQ来修改数据。使用循环。

我正在做这个

Collection.All(c => { c.needsChange = value; return true; });

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

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; }
}

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