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

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

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

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


当前回答

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

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

其他回答

假设我们有如下数据,

var items = new List<string>({"123", "456", "789"});
// Like 123 value get updated to 123ABC ..

如果我们想修改列表并将列表中的现有值替换为修改后的值,那么首先创建一个新的空列表,然后通过调用每个列表项上的修改方法来遍历数据列表,

var modifiedItemsList = new List<string>();

items.ForEach(i => {
  var modifiedValue = ModifyingMethod(i);
  modifiedItemsList.Add(items.AsEnumerable().Where(w => w == i).Select(x => modifiedValue).ToList().FirstOrDefault()?.ToString()) 
});
// assign back the modified list
items = modifiedItemsList;
collection.ToList().ForEach(c => c.PropertyToSet = value);

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

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

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

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

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

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

不,LINQ不支持大规模更新。唯一更短的方法是使用ForEach扩展方法-为什么IEnumerable上没有ForEach扩展方法?