0

背景:我正在尝试创建自己的“向量”类来帮助对数组进行数学计算。我正在重载算术运算符 ( + - * / ) 以实现我想要的功能。起初,我在我的类中使用了一个私有数组,然后实现了IEnumerable<T>接口。后来想到了继承List<T>类,但是看了几篇文章,明白应该Collection<T>改用。请注意,用数据填充我的“矢量”对象时,性能非常重要。

问题:该方法如何Collection<T>.Add()工作?List<T>.Add() 文档很清楚:

如果 Count 已经等于 Capacity,则通过自动重新分配内部数组来增加 List 的容量,并且在添加新元素之前将现有元素复制到新数组中。

但是,Collection<T>.Add() 文档根本没有说明它是如何工作的。当我用作List<T>我的基类时,我可以访问该属性,并且可以在使用该方法Capacity之前指定大小。Add()但是,Collection<T>没有Capacity属性——这就是我问这个问题的原因。我再次重申:性能非常重要。

由于性能是一个问题,也许我应该回到使用私有数组并实现IEnumerable<T>接口。你怎么看?

4

2 回答 2

4

ACollection<T>IList<T>. 的默认构造函数Collection<T>只使用一个 new List<T>,因此Add行为将与List<T>假设您使用默认构造函数相同。

但是, Collection.Add() 文档完全没有说明它是如何工作的

那是因为Add行为依赖于IList在构造函数中传递的底层。

但是,Collection 没有容量属性

同样,因为这将取决于 Collection 包装的内容。它包装了界面 IList<T>。接口没有容量的概念。可能有一个IList<T>没有已知容量的实现,比如数据库中的记录。

如果您需要容量等这些实现细节,那么只需使用List<T>. Collection<T>没有任何性能优势,List<T>因为它无论如何都在使用它。如果性能对您很重要,那么您可能希望找到一个已经解决了这个问题的库,而不是自己动手。

于 2012-06-01T16:09:43.137 回答
2

没有关于实现的细节,但是文档中有 Add 的性能特征:

List<T>.Add

如果 Count 小于 Capacity,则此方法是 O(1) 操作。如果需要增加容量以容纳新元素,则此方法变为 O(n) 操作,其中 n 为 Count。

Collection<T>.Add(截至 2012 年 6 月 1 日)

此方法是 O(1) 操作。

请注意,Collection<T>.Add对于至少作为包装器创建的集合List<T>或使用实现为 Collection() 的 Collection 的默认构造函数创建的集合看起来不正确: this(new List()) 正如@vcsjones 指出的那样。看起来像文档中的错误。

通过测量(这是解决性能问题的正确方法)或嗅探源头应该很容易验证......

旁注:您将无法使用单个数组击败 List 的 Add 性能(因为它正是 List 所做的),您需要使用更复杂的东西(如数组块列表)从 Add 获得 O(1)和项目[]。

于 2012-06-01T16:22:27.053 回答