C#最后用一个元素增加一个数组

时间:2010-02-16 10:22:27

标签: c# arrays dynamic-arrays

在我的程序中,我有一堆增长的数组,其中一个新元素逐个生长到数组的末尾。我认为列表是我程序关键部分的速度瓶颈,因为与阵列相比,它们的访问时间较慢 - 切换到阵列时性能大大提高到可接受的水平。所以为了增长数组我正在使用Array.Resize。这很好用,因为我的实现将数组大小限制为大约20个元素,因此Array.Resize的O(N)性能是有限的。

但如果有一种方法可以在最后用一个元素增加数组而不必使用Array.Resize,那会更好;我相信它会将旧数组的副本复制到新大小的数组中。

所以我的问题是,是否有一种更有效的方法可以在不使用List或Array.Resize的情况下将一个元素添加到数组的末尾?

7 个答案:

答案 0 :(得分:10)

List具有恒定的时间访问权限,就像数组一样。对于“增长阵列”,你真的应该使用List

当您知道可能要向阵列支持的结构添加元素时,您不希望一次添加一个新大小。通常最好通过在填满时将其大小加倍来增长阵列。

答案 1 :(得分:3)

如前所述,List<T>正是您所寻找的。如果您知道列表的初始大小,则可以为constructor提供初始容量,这将提高初始分配的效果:

List<int> values = new List<int>(5);

values.Add(1);
values.Add(2);
values.Add(3);
values.Add(4);
values.Add(5);

答案 2 :(得分:2)

无法调整数组大小,因此获取更大数组的唯一方法是使用Array.Resize创建新数组。

为什么不创建数组从开始(或最多需要的容量)有20个元素,并使用变量来跟踪数组中使用的元素数量?这样你就不必调整任何数组的大小。

答案 3 :(得分:1)

List's分配4个元素开头(除非你在构造它时指定容量),然后每4个元素增长。

为什么不尝试使用Array类似的东西?即创建它有4个元素,然后当你插入第五个元素时,首先用另外4个元素增长数组。

答案 4 :(得分:0)

增长数组AFAIK意味着分配了一个新数组,现有内容被复制到新实例。我怀疑这应该比使用List ...?

更快

答案 5 :(得分:0)

以块(例如10)调整阵列大小并将其作为单独的变量(例如容量)存储要快得多,然后仅在达到容量时调整阵列大小。这是列表的工作方式,但如果您更喜欢使用数组,那么您应该考虑在更大的块中调整它们的大小,特别是如果您有大量的Array.Resize调用

答案 6 :(得分:0)

我认为每个想要使用数组的方法都不会被优化,因为数组是一个静态结构,所以我认为最好使用List等动态结构。