我在C#中有一个char数组。
var arr = new char[3] { 'a','b','c' };
如何在不创建新数组的情况下在其末尾添加空格?
结果:arr = { 'a', 'b', 'c', ' ', ' ', ' ' };
这可能听起来类似于VB.NET的ReDim
。但我不确定这也是我想要的。
我希望保留其中的元素,而不是在幕后实例化一个新数组。
这只适用于Generic Collections和ArrayList吗?
由于
答案 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的类,它表示一个双向链表(意味着每个节点都有对下一个节点和前一个节点的引用),但我不确定它是否是内部实现使用数组..