Как добавить значения в массив C# после его создания?
Почему массивы в C# имеют фиксированный размер?
В C# массивы — это структуры данных с фиксированной длиной, которая задаётся при создании. Это сделано для производительности: массив выделяет непрерывный блок памяти, и доступ к элементам по индексу происходит за O(1). Изменить размер массива после создания нельзя. Но есть несколько способов «добавить» элемент, которые фактически создают новый массив.
Способ 1: Создание нового массива с копированием (ручной)
Самый прямой способ — создать массив большего размера и скопировать в него старые данные. Пример:
int[] oldArray = { 1, 2, 3 };
int newValue = 4;
// Создаём новый массив на 1 элемент больше
int[] newArray = new int[oldArray.Length + 1];
// Копируем старые элементы
for (int i = 0; i < oldArray.Length; i++)
{
newArray[i] = oldArray[i];
}
// Добавляем новый элемент в конец
newArray[newArray.Length - 1] = newValue;
oldArray = newArray; // Теперь oldArray ссылается на новый массив
// Вывод: 1, 2, 3, 4
foreach (var item in oldArray)
{
Console.Write(item + " ");
}
Этот подход используется в методах Array.Resize и Array.Copy.
Способ 2: Использование Array.Resize (встроенный метод)
.NET предоставляет статический метод Array.Resize, который делает то же самое, но короче:
int[] numbers = { 1, 2, 3 };
int newValue = 4;
Array.Resize(ref numbers, numbers.Length + 1);
numbers[numbers.Length - 1] = newValue;
// numbers теперь: 1, 2, 3, 4
Важно: ключевое слово ref обязательно, так как метод может изменить ссылку на массив (создать новый объект).
Способ 3: Использование List<T> (рекомендуется для динамического добавления)
Хотя вы упомянули, что на собеседовании могут спросить про массивы, в реальной разработке для динамического добавления элементов используют List<T>. Он внутри использует массив, но автоматически увеличивает его размер:
List<int> numbersList = new List<int>();
numbersList.Add(10);
numbersList.Add(20);
numbersList.Add(30);
// Преобразование обратно в массив, если нужно:
int[] numbersArray = numbersList.ToArray();
Способ 4: LINQ и Concat (для однократного добавления)
Если нужно добавить один элемент и получить новый массив, можно использовать LINQ:
using System.Linq;
int[] original = { 1, 2, 3 };
int[] newArray = original.Concat(new[] { 4 }).ToArray();
// newArray: 1, 2, 3, 4
Этот способ создаёт новый массив, но менее производителен из-за дополнительных накладных расходов LINQ.
Что выбрать?
- Если размер известен заранее — используйте обычный массив с индексацией.
- Если нужно часто добавлять элементы — используйте
List<T>. - Если нужно добавить 1-2 элемента и массив дальше не меняется —
Array.Resizeили LINQ. - Если на собеседовании спросят «как добавить элемент в массив» — правильный ответ: «никак, массив фиксированного размера. Но можно создать новый массив с помощью Array.Resize или использовать List, который внутри работает как динамический массив».
Надеюсь, теперь стало понятнее! Массивы в C# — это не списки, и их нужно воспринимать как фиксированные контейнеры. Для динамической работы используйте List<T>.
Альтернативный подход: Использование буфера с запасом
Если вы по каким-то причинам не хотите использовать List<T> (например, в очень старой версии .NET или в условиях жёстких ограничений по памяти), можно реализовать собственную логику «динамического массива» с буфером:
int[] buffer = new int[4]; // начальная ёмкость
int count = 0; // сколько элементов реально используется
void Add(int value)
{
if (count == buffer.Length)
{
// Увеличиваем буфер в 2 раза
int[] newBuffer = new int[buffer.Length * 2];
Array.Copy(buffer, newBuffer, buffer.Length);
buffer = newBuffer;
}
buffer[count] = value;
count++;
}
Add(10);
Add(20);
Add(30);
Add(40);
Add(50); // здесь буфер автоматически расширится до 8 элементов
// Реальный массив только из добавленных элементов:
int[] result = new int[count];
Array.Copy(buffer, result, count);
Этот подход в точности повторяет внутреннюю логику List<T>. Он полезен для понимания того, как работают динамические коллекции «под капотом». На собеседовании такой ответ покажет глубокое понимание работы с памятью и массивами в C#.
Главный минус — ручное управление размером и риск ошибок. Поэтому в продакшене всегда используйте List<T>.