是否有一种方法来做以下使用LINQ?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
为了澄清,我希望遍历集合中的每个对象,然后更新每个对象的属性。
我的用例是我在一篇博客文章上有一堆评论,我想迭代一篇博客文章上的每一条评论,并将博客文章上的datetime设置为+10小时。我可以用SQL来做,但我想把它保留在业务层。
是否有一种方法来做以下使用LINQ?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
为了澄清,我希望遍历集合中的每个对象,然后更新每个对象的属性。
我的用例是我在一篇博客文章上有一堆评论,我想迭代一篇博客文章上的每一条评论,并将博客文章上的datetime设置为+10小时。我可以用SQL来做,但我想把它保留在业务层。
当前回答
没有内置的扩展方法可以做到这一点。尽管定义一个是相当简单的。在这篇文章的底部是我定义的一个叫做Iterate的方法。它可以这样使用
collection.Iterate(c => { c.PropertyToSet = value;} );
遍历源
public static void Iterate<T>(this IEnumerable<T> enumerable, Action<T> callback)
{
if (enumerable == null)
{
throw new ArgumentNullException("enumerable");
}
IterateHelper(enumerable, (x, i) => callback(x));
}
public static void Iterate<T>(this IEnumerable<T> enumerable, Action<T,int> callback)
{
if (enumerable == null)
{
throw new ArgumentNullException("enumerable");
}
IterateHelper(enumerable, callback);
}
private static void IterateHelper<T>(this IEnumerable<T> enumerable, Action<T,int> callback)
{
int count = 0;
foreach (var cur in enumerable)
{
callback(cur, count);
count++;
}
}
其他回答
我的2便士:-
collection.Count(v => (v.PropertyToUpdate = newValue) == null);
实际上我找到了一个扩展方法,可以很好地完成我想要的
public static IEnumerable<T> ForEach<T>(
this IEnumerable<T> source,
Action<T> act)
{
foreach (T element in source) act(element);
return source;
}
你可以使用LINQ将你的集合转换为数组,然后调用array . foreach ():
Array.ForEach(MyCollection.ToArray(), item=>item.DoSomeStuff());
显然,这将不适用于结构体或内建类型(如整数或字符串)的集合。
引用Adi Lester的回答(https://stackoverflow.com/a/5755487/8917485)
我很喜欢这个答案,但这个答案有一个错误。它只是改变一个新创建的列表中的值。它必须更改为两行才能读取真正的更改列表。
var aList = collection.ToList();
aList.ForEach(c => c.PropertyToSet = value);
你可以使用Magiq,一个LINQ的批处理操作框架。