如何在不使用new关键字的情况下在C#中扩展数组

时间:2012-08-15 20:38:43

标签: c# char arrays

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

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

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

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

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

这只适用于Generic Collections和ArrayList吗?

由于

2 个答案:

答案 0 :(得分:8)

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

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

然而,有一种解决方法。看下面的方法:

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

它的工作原理如下所述:

  

此方法分配具有指定大小的新数组副本   从旧数组到新数组的元素,然后替换旧数组   数组与新的。

     

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

     

如果newSize大于旧数组的长度,则为新数组   已分配并将所有元素从旧数组复制到   新的一个。如果newSize小于旧数组的长度,则为新数组   分配数组并将元素从旧数组复制到   新的一个,直到新的填补;其余的元素   旧数组被忽略。如果newSize等于旧的长度   数组,这个方法什么都不做。

     

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

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

来源:MSDN

答案 1 :(得分:7)

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

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

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