изменить размер массива - PullRequest
52 голосов
/ 30 января 2011

Можно ли изменить размер массива после объявления? Если нет, есть ли альтернатива массивам?
Я не хочу создавать массив размером 1000, но я не знаю размер массива при его создании.

Ответы [ 15 ]

60 голосов
/ 30 января 2011

Вы можете использовать Array.Resize(), задокументировано в MSDN .

Но да, я согласен с Кори, если вам нужна структура данных динамического размера, у нас есть List счто.

Важно: Array.Resize() не изменяет размер массива (имя метода вводит в заблуждение), он создает новый массив и заменяет только ссылку передан методу.

Пример:

var array1 = new byte[10];
var array2 = array1;
Array.Resize<byte>(ref array1, 20);

// Now:
// array1.Length is 20
// array2.Length is 10
// Two different arrays.
52 голосов
/ 30 января 2011

Нет, попробуйте использовать строго типизированный Список .

Например:

Вместо использования

int[] myArray = new int[2];
myArray[0] = 1;
myArray[1] = 2;

Вы можете сделать это:

List<int> myList = new List<int>();
myList.Add(1);
myList.Add(2);

Списки используют массивы для хранения данных, поэтому вы получаете преимущество в скорости с удобством LinkedList, имея возможность добавлять и удалять элементы, не беспокоясь о том, что вручную нужно изменить его размер.

Это не означает, что размер массива (в данном случае List) не изменился - отсюда акцент на слове вручную.

Как только ваш массив достигнет своего предопределенного размера, JIT выделит новый массив в куче, который будет в два раза больше, и скопирует ваш существующий массив.

10 голосов
/ 30 января 2011

Вы можете использовать Array.Resize() в .net 3.5 и выше. Этот метод выделяет новый массив с указанным размером, копирует элементы из старого массива в новый, а затем заменяет старый массив новым. (Таким образом, вам понадобится память, доступная для обоих массивов, так как она, вероятно, использует Array.Copy под крышками)

6 голосов
/ 25 апреля 2013

Использовал этот подход для массива байтов:

Изначально:

byte[] bytes = new byte[0];

Всякий раз, когда требуется (необходимо указать исходную длину для расширения):

Array.Resize<byte>(ref bytes, bytes.Length + requiredSize);

Сброс:

Array.Resize<byte>(ref bytes, 0);

Метод типизированного списка

Первоначально:

List<byte> bytes = new List<byte>();

По необходимости:

bytes.AddRange(new byte[length]);

Выпуск / Очистка:

bytes.Clear()
5 голосов
/ 30 января 2011

В C # массивы не могут быть изменены динамически.

  • Один из подходов заключается в использовании System.Collections.ArrayList вместо native array.

  • Другое (более быстрое) решение заключается в перераспределить массив с другой размер и скопировать содержимое старого массива в новый массив.

    Для этого можно использовать общую функцию resizeArray (ниже)

    public static System.Array ResizeArray (System.Array oldArray, int newSize)  
        {
          int oldSize = oldArray.Length;
          System.Type elementType = oldArray.GetType().GetElementType();
          System.Array newArray = System.Array.CreateInstance(elementType,newSize);
    
          int preserveLength = System.Math.Min(oldSize,newSize);
    
          if (preserveLength > 0)
          System.Array.Copy (oldArray,newArray,preserveLength);
    
         return newArray; 
      }  
    
     public static void Main ()  
           {
            int[] a = {1,2,3};
            a = (int[])ResizeArray(a,5);
            a[3] = 4;
            a[4] = 5;
    
            for (int i=0; i<a.Length; i++)
                  System.Console.WriteLine (a[i]); 
            }
    
5 голосов
/ 30 января 2011

Используйте взамен List<T>.Например, вместо массива целых чисел

private int[] _myIntegers = new int[1000];

используйте

private List<int> _myIntegers = new List<int>();

позже

_myIntegers.Add(1);
5 голосов
/ 30 января 2011

Использование System.Collections.Generic.List

4 голосов
/ 13 октября 2016

Да, можно изменить размер массива. Например:

int[] arr = new int[5];
// increase size to 10
Array.Resize(ref arr, 10);
// decrease size to 3
Array.Resize(ref arr, 3);

Если вы создаете массив с помощью метода CreateInstance (), метод Resize () не работает. Например:

// create an integer array with size of 5
var arr = Array.CreateInstance(typeof(int), 5);
// this not work
Array.Resize(ref arr, 10);

Размер массива не является динамическим, даже мы можем изменить его размер. Если вам нужен динамический массив, я думаю, что вместо него можно использовать универсальный список.

var list = new List<int>();
// add any item to the list
list.Add(5);
list.Add(8);
list.Add(12);
// we can remove it easily as well
list.Remove(5);
foreach(var item in list)
{
  Console.WriteLine(item);
}
4 голосов
/ 13 мая 2015

В C # Array.Resize - это самый простой способ изменить любой массив до нового размера, например:

Array.Resize<LinkButton>(ref area, size);

Здесь я хочу изменить размер массива массива LinkButton:

<LinkButton> = указывает тип массива
ref area = ref - это ключевое слово, а 'area' - это имя массива
size = массив нового размера

3 голосов
/ 02 апреля 2013
    private void HandleResizeArray()
    {
        int[] aa = new int[2];
        aa[0] = 0;
        aa[1] = 1;

        aa = MyResizeArray(aa);
        aa = MyResizeArray(aa);
    }

    private int[] MyResizeArray(int[] aa)
    {
        Array.Resize(ref aa, aa.GetUpperBound(0) + 2);
        aa[aa.GetUpperBound(0)] = aa.GetUpperBound(0);
        return aa;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...