有没有更好的方法来扩展c#中的数组大小



当我运行此代码时,数组有一个新的大小,它有什么错误或不好的地方吗?

static int[] ExpandArray(int[] input, int add_size)
{
for (int i = 0; i < add_size; i++)
{
int[] temp = input;
input = new int[input.Length + 1];
for (var j = 0; j < temp.Length; j++)
{
input[j] = temp[j];
}
}
return input;
}
static void Main(string[] args)
{   
int[] ovride = new int[3] { 1, 2, 3 };
ovride = ExpandArray(ovride, 10);
ovride = ExpandArray(ovride, 10);
Console.WriteLine(ovride.Length);    
}        

它有什么不对或不好的地方吗?

这不是代码审查,而是:

  1. 是的。您不应该调整数组的大小。这涉及到一个新的分配和所有元素的副本。阵列也是如此。Resize((,顺便说一下
  2. 嘿,有一种方法已经做到了:数组。调整大小((。不要重新发明轮子
  3. 你绝对不应该在循环中调整大小

所以要稍微清理一下代码:

static int[] ExpandArray(int[] input, int sizeToAdd)
{
// Create a new array with the desired size
var ouput = new int[input.Length + sizeToAdd];

// Copy all elements from input to output
for (int i = 0; i < input.Length; i++)
{
output[i] = input[i];
}
// Return the new array, having the remaining 
// items set to their default (0 for int)
return output;
}

实际上,您希望input可由ref更新,然后以input = output结束。

最终,只需使用List<int>,这样可以更有效地调整大小,并在必要时自动调整大小。

您可以使用Array。调整大小:

将一维数组的元素数更改为指定的新大小。

int[] ovride = new int[3] { 1, 2, 3 };
Array.Resize(ref ovride, ovride.Length + 10);
Array.Resize(ref ovride, ovride.Length + 10);
Console.WriteLine(ovride.Length); // prints 23

但是,如果您希望集合大小发生变化,List可能更适合您的目标。