Anatoly
Anatoly

Reputation: 1916

How to dynamically resize an array?

I have an array with Length = 3 and with values, for example {1,2,3}. I need to dynamically resize it.

I know that I can use List or Array.Resize(). But I need to know how to implement my own resize method?

Upvotes: 0

Views: 4621

Answers (5)

Saveendra Ekanayake
Saveendra Ekanayake

Reputation: 3313

You can try the following code. Create new array with new size and copy the old array data to the newly created array.

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);
    }

    return newArray;
}

Upvotes: 5

M.kazem Akhgary
M.kazem Akhgary

Reputation: 19179

If this is just for practice then do it. but i suggest you use .Net Array.Resize() if you want to use it in your code. usually .Net libraries are best implemented and optimized.

Any way...you can do it with generic method

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
}

Note that you cannot do this without parameter ref. (The other way is to return array of course)

You may think arrays are passed by reference. thats true. But the references it self are passed by value. so whenever you try to change the reference it does not refer to the original array anymore. you can only change the contents. To make this possible you have to use ref to directly pass the reference into method.

About the code:

{1,2,3} if you resize it to 2 obviously it will remove the last parameter. so you will have {1,2}

if you resize it to 4 then it will give the array with new default values. either null for reference types or 0 for value types (false for Boolean type). here you will have {1,2,3,0}

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

Upvotes: 1

dlght
dlght

Reputation: 926

If you want to resize the array use the build in method Array.Resize().It will be easier and faster.

If you need a dynamically sized data structure, use List for that. You can always do array.ToList() -> fill the list and do .ToArray() later.

Upvotes: 0

rmn36
rmn36

Reputation: 656

Make an array of the new desired size, copy all items over. Make the variable that referenced your old array reference the new one.

Code from 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;
        }
    }
}

Upvotes: -1

Ilya Chumakov
Ilya Chumakov

Reputation: 25039

Well, you may look on Array.Resize source code before making your own implementation =) http://referencesource.microsoft.com/#mscorlib/system/array.cs,71074deaf111c4e3

Upvotes: 0

Related Questions