Возможность динамически менять заданный массив в C# отсутствует. Речь идет о массивах типа:
T [ ] = new T [ n ];
Чтобы таковая возможность появилась можно написать собственный метод.
Для тех кто хочет сам дойти до решения, алгоритм действий следующий (готовое решение в конце):
- Создаем функцию, которая будет принимать:
- массив нужной вам размерности (одномерный, двумерный и т.д.)
- целочисленные значения (на сколько расширить массив)
- В функции выделяем память для нового массива, размерность которого будет равна сумме размерности старого массива с целыми значениями на которые надо этот массив увеличить
- Переписываем все данные из старого массива в новый
- Возвращаем новый массив пользователю.
Вот и весь алгоритм. А теперь с кодом.
Я создам статичный метод в отдельном файле, который впоследствии буду использовать во всех своих проектах.
- public static T[ ] ExpendArray<T>( T[ ] basicArray, int value = 1 ) {
- if ( value < 1 ) {
- Debug.LogError( "Для увеличения массива надо указать целочисленное значение больше 0" );
- return basicArray;
- }
- T[ ] expendedArray = new T[ basicArray.Length + value ];
- for ( int i = 0; i < basicArray.Length; i++ ) {
- expendedArray[ i ] = basicArray[ i ];
- }
- return expendedArray;
- }
А теперь к разбору.
1-я строка.
- Указываем модификатор доступа "public", чтобы иметь возможность вызывать метод из любой части программы.
- Для чего используется модификатор "static" напишите в комментариях. Я понимаю что он тут нужен, а объяснить не могу.
- Далее указываем какой тип данных будет возвращать метод. В нашем случае воспользуемся обобщенным типом "T[ ]".
- Добавляем название метода "ExpendArray" и говорим что метод обобщенный "<T>".
- И в конце, какие типы данных принимает метод. "T[ ] basicArray" - это массив, который надо расширить, "int value = 1" - указывает насколько надо расширить массив.
Обобщенный тип данных "T[ ]" позволит нам применять данный метод для расширения массивов любого типа данных, например "int[ ]" или "string[ ]".
2-я - 5-я строки.
- Чтобы массив расширился в правильном направлении, проверяем значение принимаемого целого числа. Оно должно быть не менее 1. Причем, мы заранее указали что значение по умолчанию будет "1" , таким образом при вызове функции, если надо расширить только на 1 ячейку, можно опустить второй аргумент. Пример вызова функции без второго аргумента: "array = ExpendArray(array)". Результатом выполнения метода станет массив увеличенный на 1.
- Если проверка не прошла выводится ошибка в лог и пользователю возвращается исходный массив.
6-я строка.
- Создаем новый массив и выделяем под него память, при этом длина массива будет равна длине исходного массива плюс значение второго аргумента.
7-я - 9-я строки.
- Запускаем цикл от нуля до конца исходного массива. Если укажите длину нового массива, то будет ошибка, так как старый массив был короче.
- Переносим в каждую ячейку нового массива значения из исходного.
10-я строка.
- Возвращаем пользователю увеличенный массив.
Вот и все.
Для двумерного массива действуем аналогично. Далее код без подробной расшифровки.
public static T[ , ] ExpendArray<T>(T[,] basicArray, int addCol = 0, int addRow = 0) {
if ( addCol < 1 || addRow < 1 ) {
Debug.LogError( "Для увеличения массива надо указать целочисленное значение больше или равно 0" );
return basicArray;
}
T[ , ] expendedArray = new T[ basicArray.GetLength( 0 ) + addCol, basicArray.GetLength( 1 ) + addRow ];
for ( int i = 0; i < basicArray.GetLength( 0 ); i++ ) {
for ( int j = 0; j < basicArray.GetLength( 1 ); j++ ) {
expendedArray[ i, j ] = basicArray[ i, j ];
}
}
return expendedArray;
}
|