我有使用数组的代码,不幸的是,我无法更改其类型。如果可以,我会使用ArrayLists或类似的东西做我需要做的事情,但我不能。基本上,我正在寻找从静态数组中添加和删除对象的最佳方法。为了在运行中向项目中添加项目,我必须创建一个比旧数组大一个元素的新数组,将旧数组中的项目复制到新数组中,然后添加新项目。像这样......
public partial class dataStruct
{
private myObject[] myStaticArray;
};
private void AddItemToMyArray()
{
int oldLength = dataStruct.myStaticArray.Length;
myObject[] newMyObjectArray = new myObject[oldLength + 1];
for (int i = 0; i < oldLength; i++)
newMyObjectArray [i] = dataStruct.myStaticArray[i];
dataStruct.myStaticArray[oldLength] = new myObject();
dataStruct.myStaticArray = newMyObjectArray;
}
删除一个项目,我做同样的事情,只创建一个较小的一个项目的新数组。这感觉真的很低效。任何人都可以建议一个更好的方法,如果有的话?或任何其他想法?
提前感谢您的帮助!
答案 0 :(得分:6)
不 - 数组总是固定大小。您无法添加/删除条目。
这正是ArrayList
和List<T>
有效解决的问题。它们在内部维护一个数组,但通常大于列表的逻辑大小。当您将项目添加到List<T>
时,它将填充现有数组(如果可以),或者如果没有足够的空间,它将创建一个新的更大的数组并将内容复制到其中。这个更改对调用者来说是透明的 - 你仍然可以使用原始引用,因为它是对列表的引用而不是对底层数组的引用。
使您的代码更简单(但可能效率不高)的一件事是使用Array.Resize。它不会调整现有数组的大小,但会返回一个新数组,其中包含旧内容的浅表副本,其大小与您请求的大小相同。复制可能比手动循环快一点,但效率低下的主要原因仍然存在。
答案 1 :(得分:3)
为什么要在这里使用数组?切换到List<T>
,或者(如果您需要从中间有效删除/插入)LinkedList<T>
。
我不确定你是否意味着我的意思是“静态” - 你能澄清一下吗?
有关信息,您可以使用Array.Resize(ref myArray, newSize)
,但这不是经常更改的正确答案。
答案 2 :(得分:3)
不幸的是,我无法改变他们的类型
为什么不呢?唯一合理的答案是你有一个API,你必须使用返回它们的函数或要求它们作为参数。在这种情况下,请使用List<T>
并根据需要调用.ToArray()
或.AddRange()
方法。
答案 3 :(得分:2)
从它的声音中你无法改变数据结构,所以必须处理数组。
你唯一能得到帮助的是你可以避免循环并做一个Array.copy
int oldLength = dataStruct.myStaticArray.Length;
myObject[] newMyObjectArray = new myObject[oldLength + 1];
Array.copy(dataStruct.myStaticArray, newMyObjectArray, oldLength);
dataStruct.myStaticArray[oldLength] = new myObject();
dataStruct.myStaticArray = newMyObjectArray;
编辑实际上这可能有效:
int oldLength = dataStruct.myStaticArray.Length;
Array.Resize(dataStruct.myStaticArray, oldLength+1);
答案 4 :(得分:0)
你基本上是在编写自己的List,但效率较低。
列表在内部执行您所描述的内容,但在性能方面有一个很大的不同。
当它重新分配其内部数组时,它不只是添加一个新元素,而是添加一个块。这样,未来添加并不总是需要重新分配。这是列表的“容量” - 以及列表容量始终&gt; =列表大小的原因。
如果你必须这样做,我建议做类似的事情。但是,切换到List将是一个更好的选择。
答案 5 :(得分:0)
你可以做的任何使数组更像ArrayList
或List<T>
的事情只会导致你最终重新实现这些类的部分(或全部)。最好的方法是使用内置类,正如其他答案所述。