我有一个Length = 3
的数组和值,例如{1,2,3}。
我需要动态调整它的大小。
我知道我可以使用List或 Array.Resize()。但我需要知道如何实现自己的resize方法?
答案 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;
}
}
}