Приветствую всех, сегодня затронем интересную тему создания динамического массива. У начинающих программистов, студентов, рано или поздно при работе с массивами возникает вопрос, как увеличить, изменить динамически массив, не зная его первоначально размера. С коллекциями типа List, который расширяется по мере добавления элементов, очень удобно работать, однако иногда и требуется провернуть подобное и с обычными массивами. Да и много заданий часто я встречал по основам программирования, где требовалось динамически расширять массив. На форумах и в группах то же встречаю подобные вопросы. Я знаю три примера которые позволяют расширять массив. Начнем с примера которым пользовались еще 15 лет назад когда не было коллекций и расширяющих методов массивов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
static void Main(string[] args) { int[] numbers = new int[5] { 1, 2, 3, 4, 5 }; Expansion(ref numbers, 7); //1,2,3,4,5,0,0 Console.ReadKey(); } public static int[] Expansion(ref int[] array, int Count) { int[] num = new int[Count]; for (int i = 0; i < Count; i++) { if (array.Length > i) num[i] = array[i]; else num[i] = 0; } array = new int[Count]; array = num; return array; } |
В этом примере мы создали метод Expansion который принимает массив по ссылке и число, на которое необходимо увеличить массив. По сути в примере выше мы создаем копию массива увеличивая ее на заданное число, которое передается в метод. И возвращает увеличенный массив, который мы увеличиваем в методе Expansion. Именно подобным способом увеличивали динамически массив очень давно. Но время идет и уже не нужно изобретать велосипед, все придумали за нас. В примере ниже мы расширяем массив, однако с помощью метода Resize который присутствует в классе Array.
1 2 3 4 5 6 7 8 9 10 11 |
static void Main(string[] args) { int length = 0; int[] numbers = new int[5] { 1, 2, 3, 4, 5 }; length = numbers.Length; //5 Array.Resize(ref numbers, numbers.Length + 2); //увеличиваем массив на 2 индекса length = numbers.Length;//7 // 1,2,3,4,5,0,0} Console.ReadKey(); } |
По сути он все делает то же самое, однако, он более универсален, так как может принимать массив с любым типом. Но я не стал усложнять пример выше, для простоты понимания я использовал в своем методе Expansion тип int, при желании можно усовершенствовать мой метод.
Еще один вариант использовать коллекции, но лучше этого не делать, при работе больших данных, производительность сильно снижается, однако для примера я все же его приведу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
static void Main(string[] args) { int[] numbers = new int[5] { 1, 2, 3, 4, 5 }; List<int> list = new List<int>(numbers); Console.WriteLine(list.Count); //5 list.Add(6); list.Add(7); numbers = list.ToArray(); Console.WriteLine(numbers.Length); //7 Console.ReadKey(); } |
Думаю и тут все очевидно, мы добавили в коллекцию цифры 6,7 тем самым расширив ее и сделали копию уже в существующий массив, заменив его содержимое и увеличив в размере. Таким образом он принял все значения что и коллекция.