我在 C# 中有一个 char 数组。
var arr = new char[3] { 'a','b','c' };
如何在不创建新数组的情况下在其末尾添加空格?
结果:arr = { 'a', 'b', 'c', ' ', ' ', ' ' };
这听起来可能类似于 VB.NET 的ReDim
. 但我也不确定那是我想要的。我想保留其中的元素,而不是在幕后实例化一个新数组。
这是否仅适用于 Generic Collections 和 ArrayList?
谢谢
不幸的是,数组在设计上是预先固定的。这很重要,因为它将在堆中保留必要的内存量。
所以,回答你关于不创建新的要求:这是不可能的。
但是,有一种解决方法。看下面的方法:
Array.Resize(ref myArr, myArr.Length + 5);
它的工作原理如源代码所述:
此方法分配一个指定大小的新数组,将元素从旧数组复制到新数组,然后用新数组替换旧数组。
如果 array 为 null,则此方法创建一个具有指定大小的新数组。
如果 newSize 大于旧数组的长度,则分配一个新数组并将所有元素从旧数组复制到新数组。如果 newSize 小于旧数组的 Length,则分配一个新数组,并将元素从旧数组复制到新数组,直到填满新数组;旧数组中的其余元素将被忽略。如果 newSize 等于旧数组的 Length,则此方法不执行任何操作。
此方法是 O(n) 操作,其中 n 是 newSize。
这意味着myArr
将更新以引用新数组。但是,如果有另一个对原始数组的引用,则不会更新(它将继续引用旧版本)。
资料来源:MSDN
不,这是不可能的使用数组,通用或其他.. AFAIK,没有办法动态调整数组的大小。请改用列表。
正如 Martin 在评论中指出的那样,即使List
该类在其内部实现中也使用了数组。如果您希望真正能够动态调整数据结构的大小而无需重新初始化,您必须实现自己的链表版本。
System.Collections.Generic
包含一个名为LinkedList的类,它表示一个双向链表(意味着每个节点都有对下一个和前一个节点的引用),但我不确定它的内部实现是否使用数组..