2

我有使用数组的代码,不幸的是,我无法更改它们的类型。如果可以的话,我会使用 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;
}

为了删除一个项目,我做同样的事情,只是我创建了一个小一个项目的新数组。这感觉真的效率低下。任何人都可以提出更好的方法,如果有的话?或任何其他想法?

提前感谢您的所有帮助!

4

6 回答 6

6

否 - 数组始终是固定大小。您不能从中添加/删除条目。

这正是有效解决的ArrayList限制List<T>。它们在内部维护一个数组,但通常大于列表的逻辑大小。当您向 a 添加项目时,List<T>如果可以,它将填充现有数组,或者如果没有足够的空间,它将创建一个新的更大的数组并将内容复制到其中。但是,此更改对调用者是透明的 - 您仍然可以使用原始引用,因为它是对列表的引用,而不是对底层数组的引用。

使您的代码更简单(但可能不会更有效)的一件事是使用Array.Resize。它不会调整现有数组的大小,而是返回一个新数组,其中包含旧内容的浅表副本,大小为您请求的大小。复制可能比手动循环快一点,但效率低下的主要原因仍然存在。

于 2009-03-12T16:03:04.650 回答
3

为什么要在这里使用数组?切换到List<T>, 或(如果您需要从中间有效移除/插入) a LinkedList<T>.

我不确定您是否按照我的意思表示“静态”-您能澄清一下吗?

有关信息,您可以使用Array.Resize(ref myArray, newSize),但这不是频繁更改的正确答案。

于 2009-03-12T16:02:07.553 回答
3

不幸的是,我不能改变他们的类型

为什么不?唯一合理的答案是您有一个 API,您必须将其与返回它们或要求它们作为参数的函数一起使用。在这种情况下,根据需要使用List<T>和调用它的.ToArray().AddRange()方法。

于 2009-03-12T16:24:12.960 回答
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);
于 2009-03-12T16:09:01.360 回答
0

您基本上是在编写自己的列表,但效率较低。

List 在内部执行您所描述的操作,但在性能方面存在很大差异。

当它重新分配其内部数组时,它不仅添加了一个新元素,而且添加了它们的一个块。这样,未来的添加并不总是需要重新分配。这是列表的“容量” - 以及为什么列表容量总是 >= 列表的大小。

如果你必须这样做,我建议你做类似的事情。但是,切换到 List 将是一个更好的选择。

于 2009-03-12T16:04:17.283 回答
0

您可以做的任何事情来使数组更像ArrayListorList<T>只会导致您最终重新实现这些类的部分(或全部)。正如其他答案所述,最好的方法是使用内置类。

于 2009-03-12T16:05:05.767 回答