为什么IList <T>没有采用IEnumerable <T>的Insert方法?

Kei*_*Kei 23 c# generics ilist

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

Mar*_*ell 38

因为接口通常是使其可用所需的最少功能,以减轻实现者的负担.使用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);
}
Run Code Online (Sandbox Code Playgroud)

et voila; IList<T>现在有AddRange:

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

  • 你可以这样做,但它有风险,当你调用AddRange时,你可能希望底层对象能够理解它在一个范围内运行.在数据绑定场景中,这可能最终在一个事件足够的情况下触发数千个事件. (7认同)