如何动态调整数组大小?

时间:2015-09-29 17:45:51

标签: c#

我有一个Length = 3的数组和值,例如{1,2,3}。 我需要动态调整它的大小。

我知道我可以使用List或 Array.Resize()。但我需要知道如何实现自己的resize方法?

5 个答案:

答案 0 :(得分:3)

您可以尝试以下代码。使用新大小创建新数组并将旧数组数据复制到新创建的数组。

public static Array ResizeArray (Array oldArray, int newSize)
    int oldSize = oldArray.Length;
    Type elementType = oldArray.GetType().GetElementType();
    Array newArray = Array.CreateInstance(elementType,newSize);
    int preserveLength = System.Math.Min(oldSize,newSize);
    if (preserveLength > 0){
        Array.Copy (oldArray,newArray,preserveLength);
    }
    retuen newArray;
}

答案 1 :(得分:1)

如果只是为了练习,那就去做吧。但我建议你使用.Net Array.Resize(),如果你想在你的代码中使用它。通常.Net库最好实施和优化。

任何方式......你可以用通用方法

来做
private static void Resize<T>(ref T[] array,int size)
{
    T[] token = array.Take(size).ToArray(); // attempt to take first n elements
    T[] temp = new T[size]; // create new reference
    token.CopyTo(temp, 0); // copy array contents to new array
    array = temp; // change reference
}

请注意,如果没有参数ref,则无法执行此操作。 (另一种方式是返回数组)

您可能认为数组是通过引用传递的。确实如此。 但它自己的引用按值传递。因此,每当您尝试更改引用时,它都不再引用原始数组。你只能改变内容。为了实现这一点,您必须使用ref直接将引用传递给方法。

关于代码:

{1,2,3}如果您将其调整为2显然会删除最后一个参数。所以你将{1,2}

如果您将其调整为4,那么它将为数组提供新的默认值。引用类型为null,值类型为0(布尔类型为false)。在这里你将{1,2,3,0}

int[] array = new[] {1, 2, 3};
Resize(ref array,4);
Console.WriteLine(array.Length); // outputs 4

答案 2 :(得分:0)

好吧,您可以在创建自己的实现之前查看Array.Resize源代码=) http://referencesource.microsoft.com/#mscorlib/system/array.cs,71074deaf111c4e3

答案 3 :(得分:0)

如果要调整数组大小,请使用build in方法Array.Resize()。它将更容易,更快。

如果您需要动态大小的数据结构,请使用List。 你总是可以做array.ToList() - &gt;填写列表并稍后执行.ToArray()。

答案 4 :(得分:-1)

制作新的所需尺寸的数组,复制所有项目。使引用旧数组的变量引用新数组。

来自MSDN的代码:

public static void Resize<T>(ref T[] array, int newSize) {
    if (newSize < 0) {
        throw new ArgumentOutOfRangeException("newSize", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
        Contract.Ensures(Contract.ValueAtReturn(out array) != null);
        Contract.Ensures(Contract.ValueAtReturn(out array).Length == newSize);
        Contract.EndContractBlock();

        T[] larray = array;                
        if (larray == null) {
            array = new T[newSize];
            return;
        }

        if (larray.Length != newSize) {
            T[] newArray = new T[newSize];
            Array.Copy(larray, 0, newArray, 0,  larray.Length > newSize? newSize : larray.Length);
            array = newArray;
        }
    }
}