Как изменить размер массива с
Array.Resize(T[], Int32) Method is used to resize the number of elements present in the array. Or in other words, this method is used to change the number of elements of a one-dimensional array to the specified new size. It resizes the only 1-D array, not multidimensional array.
Syntax:
Parameters:
array: It is a one-dimensional, zero-based array to resize, or null to create a new array with the specified size.
newsize: It is the size of the new array.
Exception:If the value of nsize is less than zero, then this method will give ArgumentOutOfRangeException.
Note: This method is an O(n) operation, where n is new size.
Below given are some examples to understand the implementation in a better way:
change array size
Is it possible to change an array size after declaration? If not, is there any alternative to arrays?
I do not want to create an array with a size of 1000, but I do not know the size of the array when I’m creating it.
15 Answers 15
You can use Array.Resize() , documented in MSDN.
But yeah, I agree with Corey, if you need a dynamically sized data structure, we have List s for that.
Important: Array.Resize() doesn’t resize the array (the method name is misleading), it creates a new array and only replaces the reference you passed to the method.
No, try using a strongly typed List instead.
Instead of using
You could do this:
Lists use arrays to store the data so you get the speed benefit of arrays with the convenience of a LinkedList by being able to add and remove items without worrying about having to manually change its size.
This doesn’t mean an array’s size (in this instance, a List ) isn’t changed though — hence the emphasis on the word manually.
As soon as your array hits its predefined size, the JIT will allocate a new array on the heap that is twice the size and copy your existing array across.
You can use Array.Resize() in .net 3.5 and higher. This method allocates a new array with the specified size, copies elements from the old array to the new one, and then replaces the old array with the new one. (So you will need the memory available for both arrays as this probably uses Array.Copy under the covers)
![]()
Yes, it is possible to resize an array. For example:
If you create an array with CreateInstance() method, the Resize() method is not working. For example:
The array size is not dynamic, even we can resize it. If you want a dynamic array, I think we can use generic List instead.
In C#, arrays cannot be resized dynamically.
One approach is to use System.Collections.ArrayList instead of a native array .
Another (faster) solution is to re-allocate the array with a different size and to copy the contents of the old array to the new array.
The generic function resizeArray (below) can be used to do that.
![]()
Used this approach for array of bytes:
Whenever required (Need to provide original length for extending):
Typed List Method
Use a List<T> instead. For instance, instead of an array of ints
In C#, Array.Resize is the simplest method to resize any array to new size, e.g.:
Here, i want to resize the array size of LinkButton array:
<LinkButton> = specifies the array type
ref area = ref is a keyword and ‘area’ is the array name
size = new size array
![]()
If you really need to get it back into an array I find it easiest to convert the array to a list , expand the list then convert it back to an array .
Use a List (where T is any type or Object) when you want to add/remove data, since resizing arrays is expensive. You can read more about Arrays considered somewhat harmful whereas a List can be added to New records can be appended to the end. It adjusts its size as needed.
A List can be initalized in following ways
Using collection initializer.
Using var keyword with collection initializer.
Using new array as parameter.
Using capacity in constructor and assign.
Using Add method for each element.
Thus for an Object List you can allocate and assign the properties of objects inline with the List initialization. Object initializers and collection initializers share similar syntax.
Добавить новые элементы в массив в C#
В этом посте мы обсудим, как добавить новые элементы в массив в C#.
Поскольку мы не можем изменить размер массива после его создания в C#, нет прямого способа изменить размер массива фиксированного размера для размещения дополнительных элементов.
Если нам нужна реализация на основе массива с изменяемым размером, рекомендуемым решением является использование List . По мере добавления элементов в List , его емкость автоматически увеличивается. Но если вы настаиваете на использовании массивов, вам нужно создать экземпляр нового массива для размещения дополнительного элемента. Мы можем сделать это любым из следующих способов:
Как изменить размер массива с
В этой статье вы научитесь работать с массивами: объявлять, инициализировать и получать доступ к элементам

Содержание
Объявление массива в C/C++
В программировании часто встречается задача обработки множества экземпляров однотипных данных. Представьте себе ситуацию: мы провели опрос 100 человек и узнали их возраст. Чтобы сохранить собранные данные, вы можете создать целочисленный массив, содержащий 100 элементов:
В C++ массивы статичны: вы не сможете изменить размер или тип элементов после объявления.
Доступ к элементам массива
Вы можете получать доступ к элементам массива, используя индексы и оператор [] . Допустим, вы объявили массив marks , как показано ниже. К первому элементу можно обратиться выражением marks[0] , ко второму — выражением marks[1] , и так далее. Доступ всегда начинается с единицы, а индекс последнего элемента на единицу меньше размера массива.

Инициализация массива при объявлении
Можно инициализировать массив при объявлении. Для этого надо указать в списке столько значений, сколько вмещает массив, либо одно значение 0, чтобы заполнить массив нулями:
Обход элементов массива в цикле
Узнать число элементов в массиве можно функцией std::size. Обойти можно, используя цикл по индексам либо range-based for:
Неопределённое поведение: выход за границы (out of bounds)
Выход за пределы массива является неопределённым поведением (англ. undefined behavior). Нет гарантий, как поведёт себя программа в этом случае. Высока вероятность, что вы испортите память других переменных, но эффект может различаться в разных режимах компиляции:
Передача массива как параметра функции
Массив в стиле языка C хранит только указатель на начало и не хранит свой размер, что и создаёт сложность в передаче в функцию. Размер массива известен во время компиляции, но не известен во время выполнения. Поэтому передать размер можно несколькими не очень очевидными путями:
Динамически изменяемый массив
Обычные массивы имеют неизменный размер. Вы можете ввести вспомогательную переменную, которая бы хранила число реально используемых ячеек массива. Но и в этом случае вы не сможете использовать элементов больше, чем задано при компиляции в виде размера массива.
Так мог бы выглядеть имитация динамического массива:
Класс std::vector<T>
Стандартная библиотека C++ содержит шаблонный класс vector, который работает как динамический массив произвольного размера. Размер может расти до тех пор, пока у операционной системы есть область памяти подходящего размера (вплоть до нескольких гигабайт).
Класс является шаблонным, то есть при объявлении переменной потребуется параметризовать шаблон класса vector типом элемента:
Использование вектора похоже на использование массива:
- работает запрос элемента ages[index] , причём индексация так же начинается с нуля
- при выходе за границы динамического массива так же возникает неопределённое поведение (англ. undefined behavior)
- работает перебор элементов с помощью индексов, range-based for или итераторов
- есть метод size для получения размера: ages.size()
Добавление элементов в конец массива
Для добавления существует два метода: push_back и emplace_back
- push_back получает значение элемента и добавляет в конец
- emplace_back работает сложнее: он получает параметры, необходимые конструктору элемента, и конструирует его прямо в конце массива
Вы можете практически всегда использовать push_back. Метод pop_back можно использовать для удаления элемента:
В документации std::vector можно прочитать о других методах.
Перемещение элементов в памяти при изменении массива
Динамический массив использует для хранения элементов динамическую память (так же известную как “куча”, англ. heap). При добавлении большого числа элементов динамический массив несколько раз перераспределяет память, поскольку выделенной ранее линейной области памяти уже не хватает для хранения всех элементов. Обычно при нехватке памяти под очередной элемент vector запрашивает новую область памяти в 1,5-2 раза больше предыдущей, перемещает в неё уже существующие элементы и добавляет в конец новый, а затем освобождает старую область памяти.
Если не сообразили, как это происходит, взгляните на картинку:

Новая область находится уже другом месте, потому что менеджер динамической памяти не мог просто взять и расширить старую область (ведь сразу за ней находилась чужая память). Поэтому все итераторы, ссылки и указатели на элементы могут стать некорректными после любого изменения массива!
Метод erase для удаления элементов из середины
Метод erase класса vector получает итератор и уничтожает элемент, на который итератор указывает:
Последствия перемещения элементов: ошибка в простом цикле с erase
Использование итератора, ссылки или указателя на элемент после перераспределения памяти в массиве является неопределённым поведением: скорее всего произойдёт падение программы либо будет пропущено несколько элементов коллекции. Это показано в примере ниже:
Если вы запустите этот код, вы можете увидеть что угодно. Скорее всего программа выведет 10 38 99 , хотя должна вывести 10 23 7 38 99 по замыслу автора.
Для решения этой проблемы метод erase возвращает новый, валидный итератор на элемент, следующий после удалённого. Если элемент был последним, erase вернёт итератор end. Учитывая это, мы можем исправить код, чтобы новое значение it либо получалось из erase, либо получалось путём инкремента:
Программа корректно напечатает 10 23 7 38 99 .
Идиома remove_if + erase
В C++ есть замечательная библиотека алгоритмов <algorithm> . В данном случае алгоритмом называют шаблон функции, способный заменить цикл в какой-то одной узкой задаче. Например, remove_if перемещает элементы, соответствующие условию, в конец массива (в “удалённую” зону), и возвращает итератор на начала “удалённой” зоны. Затем вызовом erase можно уничтожить элементы из этой зоны.