C#在数组末尾增加一个元素

4
在我的程序中,我有一堆增长的数组,其中一个新元素逐个增加到数组的末尾。我发现,在程序的关键部分,由于列表相对于数组的访问速度较慢,所以列表是速度瓶颈 - 切换到数组将性能大大提高到可接受的水平。因此,为了增加数组的大小,我正在使用Array.Resize。由于我的实现限制了数组大小约为20个元素,因此Array.Resize的O(N)性能是有界的,这很有效。
但更好的方法是,如果有一种方法可以在不使用Array.Resize的情况下仅将数组增加一个元素,则会更好;我认为这会将旧数组复制到新大小的数组中。
因此,我的问题是,是否有更有效的方法可以添加一个元素到数组的末尾,而不使用List或Array.Resize?
7个回答

10

与数组类似,List拥有常数时间访问。对于“可扩展的数组”,你确实应该使用List

当你知道可能会向支持数组的结构中添加元素时,不要一次性添加一个新大小。通常最好的方法是在填满时将数组的大小加倍。


3
如果你需要在处理结束时得到一个数组,当然可以使用 .ToArray()。 - Sky Sanders

3
正如之前提到的,List<T> 是你要寻找的。如果你知道列表的初始大小,可以在构造函数中提供一个初始容量,这将提高你的初始分配性能:
List<int> values = new List<int>(5);

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

1

List会在开始时分配4个元素(除非您在构造时指定容量),然后每4个元素增长一次。

为什么不尝试使用类似的方法来处理Array呢?即,将其创建为具有4个元素,然后在插入第五个元素时,首先通过另外4个元素来扩展数组。


1

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

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


0
据我所知,扩展数组意味着分配一个新数组,将现有内容复制到新实例中。我怀疑这是否比使用List更快?

列表在读取时似乎比数组慢。在我的代码的关键部分,我经常读取数组,因此这会产生巨大的影响。 - Projectile Fish

0

将数组分块(例如10个)调整大小并将其存储为单独的变量,例如容量,然后仅在达到容量时才调整数组大小,这样速度会更快。这就是列表的工作原理,但如果您喜欢使用数组,则应该考虑以较大的块来调整它们的大小,特别是如果您有大量的Array.Resize调用。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接