4

我在 C# 中有一个 char 数组。

var arr = new char[3] { 'a','b','c' };

如何在不创建新数组的情况下在其末尾添加空格?

结果:arr = { 'a', 'b', 'c', ' ', ' ', ' ' };

这听起来可能类似于 VB.NET 的ReDim. 但我也不确定那是我想要的。我想保留其中的元素,而不是在幕后实例化一个新数组。

这是否仅适用于 Generic Collections 和 ArrayList?

谢谢

4

2 回答 2

8

不幸的是,数组在设计上是预先固定的。这很重要,因为它将在堆中保留必要的内存量。

所以,回答你关于不创建新的要求:这是不可能的

但是,有一种解决方法。看下面的方法:

Array.Resize(ref myArr, myArr.Length + 5);

它的工作原理如源代码所述:

此方法分配一个指定大小的新数组,将元素从旧数组复制到新数组,然后用新数组替换旧数组。

如果 array 为 null,则此方法创建一个具有指定大小的新数组。

如果 newSize 大于旧数组的长度,则分配一个新数组并将所有元素从旧数组复制到新数组。如果 newSize 小于旧数组的 Length,则分配一个新数组,并将元素从旧数组复制到新数组,直到填满新数组;旧数组中的其余元素将被忽略。如果 newSize 等于旧数组的 Length,则此方法不执行任何操作。

此方法是 O(n) 操作,其中 n 是 newSize。

这意味着myArr将更新以引用新数组。但是,如果有另一个对原始数组的引用,则不会更新(它将继续引用旧版本)。

资料来源:MSDN

于 2012-08-15T20:41:20.853 回答
8

不,这是不可能的使用数组,通用或其他.. AFAIK,没有办法动态调整数组的大小。请改用列表

正如 Martin 在评论中指出的那样,即使List该类在其内部实现中也使用了数组。如果您希望真正能够动态调整数据结构的大小而无需重新初始化,您必须实现自己的链表版本。

System.Collections.Generic包含一个名为LinkedList的类,它表示一个双向链表(意味着每个节点都有对下一个和前一个节点的引用),但我不确定它的内部实现是否使用数组..

于 2012-08-15T20:43:26.557 回答