97

List.AddRange() exists, but IList.AddRange() doesn't.
This strikes me as odd. What's the reason behind this?

4

2 回答 2

71

因为界面应该易于实现并且不包含“除了厨房之外的所有内容”。如果添加AddRange,则应添加InsertRangeRemoveRange(为了对称)。一个更好的问题是为什么没有IList<T>类似于接口的接口的扩展方法IEnumerable<T>。(就地Sort, BinarySearch, ... 的扩展方法会很有用)

于 2012-07-18T09:37:14.997 回答
15

对于那些想要在 IList 上具有“AddRange”、“Sort”、... 的扩展方法的人,

下面是AddRange扩展方法:

 public static void AddRange<T>(this IList<T> source, IEnumerable<T> newList)
 {
     if (source == null)
     {
        throw new ArgumentNullException(nameof(source));
     }

     if (newList == null)
     {
        throw new ArgumentNullException(nameof(newList));
     }

     if (source is List<T> concreteList)
     {
        concreteList.AddRange(newList);
        return;
     }

     foreach (var element in newList)
     {
        source.Add(element);
     }
}

我创建了一个小型库来执行此操作。我发现它比必须在每个项目上重做其扩展方法更实用。

有些方法比 List 慢,但它们可以完成工作。

这是让他们感兴趣的 GitHub:

IListExtension 存储库

于 2019-07-31T12:04:10.050 回答