3 апреля 2011 г.

Изменение размера двухмерного массива в С#

Для одномерного массива есть замечательная функция:
public static void Resize<T>(
                                            ref T[] array,
                                            int newSize )
где T - Тип элементов массива.
      array - Подлежащий изменению размера одномерный массив, индексация которого начинается    с нуля, или значение null для создания нового массива заданного размера.
      newSize - Размер нового массива.
      (ref - ссылка)

Для двухмерного массива такой вещи нет, поэтому пришлось придумать самому и вот что получилось:
class Array2
    {   // Изменение размера двухмерного массива, где a и b - новые размеры массива
        public static void Resize<T>(ref T[,] arr, int a, int b)
        {   //создаем временный массив
            T[,] tmp = new T[a,b];
            c = arr.GetLength(0);
            d = arr.GetLength(1);
            for (int i = 0; i < a; i++)
            {   //переход по элементам
                for (int j = 0; j < b; j++)
                {   //чтобы не выйти за пределы исходного массива, если увеличиваем
                    if (i < c && j < d)
                        tmp[i, j] = arr[i, j]; //перемещаем элементы во временный массив
                    else
                        tmp[i, j] = default(T); //если увеличиваем, то заполняем массив элементами по умолчанию
                }
            }
            arr = tmp; //перемещаем обратно в исходный массив
        }
    }
В благодраность можете пройти по одной из рекламных ссылок на странице ;)
Если есть придложения, пишите. Рассмотрю ваши варианты по внесению изменений в код.
Метод протестирован на int и string, как на увеличение, так и на уменьшение размера.

Update: вариант номер два
public static void ResizeArray<T>(ref T[,] original, int cols, int rows)
{
  T[,] newArray = new T[rows, cols];
  Array.Copy(original, newArray, original.Length);
  original = newArray;
}

4 комментария:

  1. здорово, спасибо

    ОтветитьУдалить
  2. Здравствуйте. Есть вопрос, как потом вызвать public static void Resize? Resize(ref char[,] Arr,xsize,ysize) вот так не получается. p.s. я новичек, изучаю C#

    ОтветитьУдалить
    Ответы
    1. а нафиг пишешь что ссылка, в шарпах все ссылки :) просто пишешь туда туда свой массив
      второе: надо в больше меньше заключить тип передаваемого массива, иначе работать не будет :(
      не могу привести правильный вариант, блогспот считает что я пишу html :(

      Удалить
  3. гг, ref это не просто ссылка, ref - магическая ссылка =)...

    Попробуй переинициилизировать массив другого размера внутри другой области видимости без ref =), изменится ли содержимое массива ?

    ОтветитьУдалить