How to resize an array in C#

In C#, arrays cannot be resized dynamically. One approach is to use System.Collections.ArrayList instead of a native array. Another solution is to re-allocate the array with a different size and copy the content of the old array to the new array.



Since .NET 2.0, Array.Resize() can be used to re-allocate an array. Array.Resize() creates a new array, copies the content of the old array into the new array and replaces the passed array reference with a reference to the new array.

The documentation of Array.Resize() is a bit misleading. The old array is not replaced with the new one. Only the passed variable is changed to point to the new array. The following example demonstrates that:

public static void Main() {

   int[] a1 = {1, 2, 3};
   int[] a2 = a1;
   a2[0] = 55;                         // this also modifies a1[0]
   System.Array.Resize(ref a1, 5);     // this only modifies a1, not a2
   a2[0] = 66;                         // this only modifies a2[0], not a1[0]

   // a1 now points to the new array which has length 5.
   System.Console.WriteLine("a1.Length=" + a1.Length);
   for (int i = 0; i < a1.Length; i++) {
      System.Console.WriteLine("a1[" + i + "]=" + a1[i]);
   }

   // a2 still points to the old array with length 3.
   System.Console.WriteLine("a2.Length=" + a2.Length);
   for (int i = 0; i < a2.Length; i++) {
      System.Console.WriteLine("a2[" + i + "]=" + a2[i]);
   }
}



For .NET 1.x, the generic function bewlow can be used to re-allocate an array:

// Reallocates an array with a new size, and copies the contents
// of the old array to the new array.
// Arguments:
//   oldArray  the old array, to be reallocated.
//   newSize   the new array size.
// Returns     A new array with the same content.
public static System.Array ResizeArray (System.Array oldArray, int newSize) {
   int oldSize = oldArray.Length;
   System.Type elementType = oldArray.GetType().GetElementType();
   System.Array newArray = System.Array.CreateInstance(elementType, newSize);
   int preserveLength = System.Math.Min(oldSize, newSize);
   if (preserveLength > 0) {
      System.Array.Copy (oldArray, newArray, preserveLength);
   }
   return newArray;
}

// Test routine for ResizeArray().
public static void Main () {
   int[] a = {1, 2, 3};
   a = (int[])ResizeArray(a, 5);
   a[3] = 4;
   a[4] = 5;
   for (int i = 0; i < a.Length; i++) {
      System.Console.WriteLine(a[i]);
   }
}


Author: Christian d'Heureuse (www.source-code.biz, www.inventec.ch/chdh)
License: Free / LGPL
Index