首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AddRange到集合

AddRange到集合
EN

Stack Overflow用户
提问于 2009-09-25 00:33:12
回答 9查看 160K关注 0票数 138

一位同事今天问我如何在一个集合中添加一个范围。他有一个继承自Collection<T>的类。有一个已包含某些项的那种类型的get-only属性。他希望将另一个集合中的项添加到属性集合中。他怎么能以C#3友好的方式这么做呢?(请注意有关get-only属性的约束,它阻止执行Union和重新分配之类的解决方案。)

当然,有财产的前夫。添加将有效。但List<T>-style AddRange则要优雅得多。

编写扩展方法非常容易:

代码语言:javascript
运行
复制
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?错过了显而易见的吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-09-25 00:40:37

不,这看起来很合理。有一个List.AddRange()方法基本上就是这样做的,但是要求您的集合是一个具体的List<T>

票数 74
EN

Stack Overflow用户

发布于 2014-10-14 11:44:19

在运行循环之前,尝试转换到扩展方法中的列表。这样,您就可以利用List.AddRange的性能。

代码语言:javascript
运行
复制
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);
        }
    }
}
票数 45
EN

Stack Overflow用户

发布于 2015-01-15 15:17:35

.NET4.5开始,如果你想要一条线,你ForEach。

代码语言:javascript
运行
复制
source.ForEach(o => destination.Add(o));

或者更短的

代码语言:javascript
运行
复制
source.ForEach(destination.Add);

就性能而言,它与每个循环(语法糖)相同。

另外,不要尝试分配它,如

代码语言:javascript
运行
复制
var x = source.ForEach(destination.Add) 

因为ForEach是无效的。

编辑:复制自评论,利珀特对ForEach的看法

票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1474863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档