List.AddRange()
存在,但IList.AddRange()
不存在。
这让我感到奇怪。这是什么原因呢?
Answers:
因为界面应该易于实现,并且不包含“厨房以外的所有东西”。如果添加AddRange
,则应添加InsertRange
和RemoveRange
(用于对称)。一个更好的问题是,为什么没有IList<T>
类似于该IEnumerable<T>
接口的扩展方法。(就地扩展方法Sort
,BinarySearch
...将是有益的)
IFoo
)声明没有(而且仍然没有)以任何方式指定“帮助”命名空间(例如MyAssembly
),使得如果类声明要实现IFoo
但缺少方法int Bar(String)
,则编译器将自动生成方法int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);}
如果存在这样的功能,则接口可以包含更多的方法,例如AddRange
可以根据基本行为来实现,但是可以对某些实现进行优化。
对于那些想要在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:
AddRange/RemoveRange/InsertRange
可以直接在“内部”集合上工作,并优化Capacity
管理和使用诸如Array.Copy
在数据块之间移动的方法。扩展方法RemoveRange
很可能是magniture的顺序慢于List.RemoveRange