【问题标题】:Why IList<T> does not have Insert methods which take IEnumerable<T>?为什么 IList<T> 没有采用 IEnumerable<T> 的插入方法?
【发布时间】:2009-07-12 22:54:05
【问题描述】:

我的情况是,我只想将字符串数组(类型 String[])中的值附加到具有 IList 的对象。在 MSDN 上快速查找显示 IList 的 Insert 方法只有一个采用索引和对象 T 的版本,而没有采用 IEnumerable 而不是 T 的版本。这是否意味着我必须在输入列表上编写一个循环才能将值放入目标列表?如果是这样的话,对我来说,这似乎是非常有限且非常不友好的 API 设计。也许,我错过了一些东西。在这种情况下,C# 专家会做什么?

【问题讨论】:

    标签: c# generics ilist


    【解决方案1】:

    因为接口通常是使其可用所需的最少功能,以减轻实现者的负担。使用 C# 3.0,您可以将其添加为扩展方法:

    public static void AddRange<T>(this IList<T> list, IEnumerable<T> items) {
        if(list == null) throw new ArgumentNullException("list");
        if(items == null) throw new ArgumentNullException("items");
        foreach(T item in items) list.Add(item);
    }
    

    等等; IList&lt;T&gt; 现在有AddRange

    IList<string> list = ...
    string[] arr = {"abc","def","ghi","jkl","mno"};
    list.AddRange(arr);
    

    【讨论】:

    • 你可以这样做,但是它有它的风险,当你调用 AddRange 时,你可能期望底层对象对它在一个范围内操作有一些了解。在数据绑定场景中,在一个事件就足够的场景中,这最终可能会触发数千个事件。
    • @Sam;确实;但这是您可以通过 IList 做的最好的事情;当然有办法弥补……
    • 感谢马克的回答。考虑到将一个列表附加到另一个列表是一种如此常见的操作,我仍然觉得应该以可用性比可实现性更重要的方式设计界面。无论如何,扩展方法在这种情况下非常有用,所以它可能没什么好大惊小怪的......
    • @Kei - 但它在很大程度上是多余的(即已经可以实现),所以我可以理解它不作为额外的接口方法存在。
    • “可怕的”花括号放置是怎么回事? ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多