一位同事今天问我如何在一个集合中添加一个范围。他有一个继承自Collection<T>
的类。有一个已包含某些项的那种类型的get-only属性。他希望将另一个集合中的项添加到属性集合中。他怎么能以C#3友好的方式这么做呢?(请注意有关get-only属性的约束,它阻止执行Union和重新分配之类的解决方案。)
当然,有财产的前夫。添加将有效。但List<T>
-style AddRange则要优雅得多。
编写扩展方法非常容易:
public static class CollectionHelpers
{
public static void AddRange<T>(this ICollection<T> destination,
IEnumerable<T> source)
{
foreach (T item in source)
{
destination.Add(item);
}
}
}
但我有种感觉我在重新发明方向盘。我在System.Linq
或莫雷林中没有发现类似的东西。
糟糕的设计?打电话给Add?错过了显而易见的吗?
发布于 2009-09-25 00:40:37
不,这看起来很合理。有一个List.AddRange()
方法基本上就是这样做的,但是要求您的集合是一个具体的List<T>
。
发布于 2014-10-14 11:44:19
在运行循环之前,尝试转换到扩展方法中的列表。这样,您就可以利用List.AddRange的性能。
public static void AddRange<T>(this ICollection<T> destination,
IEnumerable<T> source)
{
List<T> list = destination as List<T>;
if (list != null)
{
list.AddRange(source);
}
else
{
foreach (T item in source)
{
destination.Add(item);
}
}
}
发布于 2015-01-15 15:17:35
从.NET4.5
开始,如果你想要一条线,你ForEach。
source.ForEach(o => destination.Add(o));
或者更短的
source.ForEach(destination.Add);
就性能而言,它与每个循环(语法糖)相同。
另外,不要尝试分配它,如
var x = source.ForEach(destination.Add)
因为ForEach
是无效的。
编辑:复制自评论,利珀特对ForEach的看法。
https://stackoverflow.com/questions/1474863
复制相似问题