有没有办法像对待ArrayList一样处理c#静态数组?

时间:2009-03-12 15:59:34

标签: c# arrays arraylist

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

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

提前感谢您的帮助!

6 个答案:

答案 0 :(得分:6)

不 - 数组总是固定大小。您无法添加/删除条目。

这正是ArrayListList<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)

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