Записки опиумного мака

обо всем по немногу

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

Для одномерного массива есть замечательная функция:

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

  2. а нафиг пишешь что ссылка, в шарпах все ссылки 🙂 просто пишешь туда туда свой массив
    второе: надо в больше меньше заключить тип передаваемого массива, иначе работать не будет 🙁
    не могу привести правильный вариант, блогспот считает что я пишу html 🙁

  3. гг, ref это не просто ссылка, ref — магическая ссылка =)…

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

Добавить комментарий для Unknown Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *