问题描述
在.NET/C#程序开发中,使用LINQ如何修改集合List<T>中的所有元素的属性值?
比如以下的伪代码:
foreach (var c in collection)
{
c.PropertyToSet = value;
}
在.NET/C#程序开发中,使用Linq
如何实现以上的foreach
循环,以达到修改集合collection
中所有元素的指定属性值的目的呢?
方案一
使用Linq
的Select
静态扩展方法,如下:
collection.Select(c => {c.PropertyToSet = value; return c;}).ToList();
方案二
使用List<T>
的ForEach()
方法,如:
collection.ToList().ForEach(c => c.PropertyToSet = value);
方案三
使用Linq
的All
方法,如:
Collection.All(c => { c.needsChange = value; return true; });
方案四
创建静态扩展方法,如:
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++;
}
}
调用方法:
collection.Iterate(c => { c.PropertyToSet = value;} );
方案五
另一个静态扩展方法:
public static int Update<TSource>(this IEnumerable<TSource> source, Func<TSource> action)
{
if (source == null) throw new ArgumentNullException("source");
if (action == null) throw new ArgumentNullException("action");
if (typeof (TSource).IsValueType)
throw new NotSupportedException("value type elements are not supported by update.");
var count = 0;
foreach (var element in source)
{
action(element);
count++;
}
return count;
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册