Как создать динамический массив в c#

Создание динамического массива в языке c#

На днях мне попалась задача, для решения которой требовалось создать динамический массив. Обычно я привык вместо массивов использовать обобщенные списки List<T>, которые по умолчанию являются динамическими. Но, по условию задачи требовалось работать именно с массивом, который не является таковым, поэтому возникла небольшая проблема, решение которой описано в этой статье.

В языке c# под словом массив подразумевается объект с заранее заданным неизменяемым размером. То есть, к примеру, если Вы создали массив, который содержит пять элементов, то увеличить данный размер динамически Вы уже не сможете, так как он является фиксированным. В этом можно легко убедиться, воспользовавшись свойством IsFixedSize.

int [] numbers = new int [5];
bool fix = numbers.IsFixedSize;  //true

С помощью данного свойства Вы можете определить, имеет ли созданный массив фиксированную длину. Если результатом является значение true, как в данном примере, то это значит, что мы не можем добавлять или удалять элементы в уже созданном массиве, то есть изменять его текущий размер. Но, при этом мы можем изменять его существующие элементы.

Так как задача довольно актуальная, то какой-то способ решения всё-таки должен быть. И он есть. Если Вам необходимо создать динамический массив, то Вы можете воспользоваться, например методом Resize класса System.Array.

static void Main(string [] args)
{
int length = 0;
int [] numbers = new int [5] {1,2,3,4,5};
length = numbers.Length; //5
Array.Resizeint>(ref numbers, 7);
//либо так
//Array.Resize(ref numbers, numbers.Length + 2);
length = numbers.Length; //7
Результат: {1,2,3,4,5,0,0} //- элементы
}

Данный метод принимает два параметра: имя массива и его новый размер. В ходе выполнения метода, будет создан новый массив указанной нами длины, после чего все значения из старого массива будут скопированы в него. В результате мы получаем динамический массив. Задача решена.

Либо мы можем схитрить и всё-таки решить данную задачу, воспользовавшись обобщенным списком List<T> класса System.Collections.Generic, например:

static void Main(string [] args)
{
int count = 0;
List<int> numbers = new List<int>  { 1, 2, 3, 4, 5 };
count = numbers.Count; //5
numbers.Add(6);
numbers.Add(7);
count = numbers.Count; //7
//преобразуем список в массив
int [] numbers2 = numbers.ToArray<int>();
}

Вместо массива мы используем список, который, как уже говорилось ранее, по умолчанию является динамическим. С помощью него мы выполняем всю необходимую работу и как только добиваемся нужного результата, то с помощью метода ToArray преобразуем список в массив.

Читайте также:

5 комментариев

  1. Руслан says:

    Спасибо

  2. Jaqen H'ghar says:

    С двумерным массивом работает?
    strArr[x,2]. x &#8212; то, что по условиям задачи динамическое. от 0 до &#8230;. много может быть

  3. &#171;С двумерным массивом работает?&#187; &#8212; Нет.

    MSDN: Метод Resize<T> может изменить только одномерный массив.
    Класс Array не содержит метод для изменения многомерных массивов.
    Необходимо предоставить или собственный код или вызвать метод одноцелевой в библиотеке третьей стороны

    Вот есть готовое решение с сайта stackoverflow:

    void ResizeArray(ref T[,] original, int newCoNum, int newRoNum)
    {
    var newArray = new T[newCoNum, newRoNum];
    int columnCount = original.GetLength(1);
    int columnCount2 = newRoNum;
    int columns = original.GetUpperBound(0);
    for (int co = 0; co < = columns; co++)
    Array.Copy(original, co * columnCount, newArray, co * columnCount2, columnCount);
    original = newArray;
    }

  4. ув. admin. c увеличением 2мерного массива понятно. но как быть с 4 мерным. если его нужно увеличивать(границы двигать,расширять ) вверх/вниз/влево/вправо по первым двум измерениям(т е вправо/влево по 0 измерению, и вниз/вверх по 1 . измерения 2 и 3 считать что то типа 32 и 32, т е константными.).
    на англ сайте есть вариант public void ResizeArray( ref T[,] array, int padLeft, int padRight, int padTop, int padBottom), хотя он не катит, видимонадо чтото и гдето доработать.

  5. Пример с 3-x мерным массивом: stackoverflow

    Либо можно использовать вместо многомерного jagged массив.

    «>

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*