AddRange添加到集合
今天一位同事问我如何在一个系列中增加一个范围。 他有一个继承自Collection<T>
。 有一种只包含某些项目的只能获取属性。 他想将另一个集合中的项目添加到属性集合中。 他如何以C#3友好的方式来做到这一点? (请注意关于只读属性的约束,这会阻止像联合和重新分配这样的解决方案。)
当然,与财产的foreach。 添加将工作。 但是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
或morelinq中找不到类似的东西。
糟糕的设计? 打电话添加? 缺少显而易见的?
不,这看起来很合理。 有一个List<T>.
基本上只是这样做的AddRange()方法,但要求您的集合成为具体的List<T>
。
在运行循环之前,尝试在扩展方法中转换为List。 这样你可以利用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);
}
}
}
请记住,每次Add
都会检查集合的容量,并在必要时调整其大小(较慢)。 使用AddRange
,集合将被设置为容量,然后添加项目(更快)。 这种扩展方法将非常缓慢,但会起作用。