有没有办法使用LINQ执行以下操作?
foreach (var c in collection) { c.PropertyToSet = value; }
为了澄清,我想迭代集合中的每个对象,然后更新每个对象的属性.
我的用例是我在博客文章中有一堆评论,我想在博客文章中迭代每个评论,并将博客帖子上的日期时间设置为+10小时.我可以在SQL中完成它,但我想将它保留在业务层中.
虽然您可以使用ForEach
扩展方法,但如果您只想使用框架,则可以使用
collection.Select(c => {c.PropertyToSet = value; return c;}).ToList();
该ToList
是必要的,以评估立即选择由于懒惰的评估.
collection.ToList().ForEach(c => c.PropertyToSet = value);
我这样做
Collection.All(c => { c.needsChange = value; return true; });
我实际上找到了一个扩展方法,可以很好地完成我想要的操作
public static IEnumerableForEach ( this IEnumerable source, Action act) { foreach (T element in source) act(element); return source; }
使用:
ListOfStuff.Where(w => w.Thing == value).ToList().ForEach(f => f.OtherThing = vauleForNewOtherThing);
我不确定这是否过度使用LINQ,但是当想要更新列表中特定条件的特定项时,它对我有用.
没有内置的扩展方法来执行此操作.虽然定义一个是相当直接的.在帖子的底部是我定义的一个名为Iterate的方法.它可以像这样使用
collection.Iterate(c => { c.PropertyToSet = value;} );
迭代源
public static void Iterate(this IEnumerable enumerable, Action callback) { if (enumerable == null) { throw new ArgumentNullException("enumerable"); } IterateHelper(enumerable, (x, i) => callback(x)); } public static void Iterate (this IEnumerable enumerable, Action callback) { if (enumerable == null) { throw new ArgumentNullException("enumerable"); } IterateHelper(enumerable, callback); } private static void IterateHelper (this IEnumerable enumerable, Action callback) { int count = 0; foreach (var cur in enumerable) { callback(cur, count); count++; } }
我已经尝试了一些变化,我会继续回到这个人的解决方案.
http://www.hookedonlinq.com/UpdateOperator.ashx
再次,这是别人的解决方案.但我已经将代码编译成一个小型库,并且经常使用它.
我将在这里粘贴他的代码,因为他的网站(博客)将来某个时候不再存在.(没有什么比看到帖子上写着"这是你需要的确切答案",点击和死网更糟糕了.)
public static class UpdateExtensions { public delegate void Func(TArg0 element); /// /// Executes an Update statement block on all elements in an IEnumerable ///sequence. /// The source element type. /// The source sequence. /// The update statement to execute for each element. ///The numer of records affected. public static int Update(this IEnumerable source, Func 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; } );