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 ,集合将被设置为容量,然后添加项目(更快)。 这种扩展方法将非常缓慢,但会起作用。

链接地址: http://www.djcxy.com/p/9127.html

上一篇: AddRange to a Collection

下一篇: Inheriting from List<T>