Изменить размер массива

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

Ответ 1

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

Например:

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

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 выделит новый массив в куче, который в два раза больше размера и скопирует существующий массив.

Ответ 2

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

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

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

Пример:

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.

Ответ 3

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

Ответ 4

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

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

byte[] bytes = new byte[0];

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

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

Reset:

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

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

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

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

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

bytes.AddRange(new byte[length]);

Release/Clear:

bytes.Clear()

Ответ 6

Вместо этого используйте List<T>. Например, вместо массива ints

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

использование

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

позже

_myIntegers.Add(1);

Ответ 7

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

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

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

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

Ответ 8

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

  • Один из подходов - использовать 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]); 
            }
    

Ответ 9

    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;
    }

Ответ 10

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

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);
}

Ответ 11

Используйте список (где T - любой тип или объект), когда вы хотите добавлять/удалять данные, поскольку размер массивов дорог. Вы можете больше узнать о Массивы считаются несколько вредными, тогда как список можно добавить к новым записям, которые можно добавить к концу. Он подстраивает свой размер по мере необходимости.

Список можно инициализировать следующими способами:

Использование инициализатора коллекции.

List<string> list1 = new List<string>()
{
    "carrot",
    "fox",
    "explorer"
};

Использование ключевого слова var с инициализатором коллекции.

var list2 = new List<string>()
{
    "carrot",
    "fox",
    "explorer"
};

Использование нового массива в качестве параметра.

string[] array = { "carrot", "fox", "explorer" };
List<string> list3 = new List<string>(array);

Использование емкости в конструкторе и назначение.

List<string> list4 = new List<string>(3);
list4.Add(null); // Add empty references. (Not Recommended)
list4.Add(null);
list4.Add(null);
list4[0] = "carrot"; // Assign those references.
list4[1] = "fox";
list4[2] = "explorer";

Использование метода Add для каждого элемента.

List<string> list5 = new List<string>();
list5.Add("carrot");
list5.Add("fox");
list5.Add("explorer");

Таким образом, для списка объектов вы можете выделить и назначить свойства объектов inline с помощью инициализации списка. Инициализаторы инициализаторов и инициализаторы коллекций используют аналогичный синтаксис.

class Test
{
    public int A { get; set; }
    public string B { get; set; }
}

Инициализировать список с инициализатором коллекции.

List<Test> list1 = new List<Test>()
{
    new Test(){ A = 1, B = "Jessica"},
    new Test(){ A = 2, B = "Mandy"}
};

Инициализировать список новыми объектами.

List<Test> list2 = new List<Test>();
list2.Add(new Test() { A = 3, B = "Sarah" });
list2.Add(new Test() { A = 4, B = "Melanie" });

Ответ 12

Это сработало для меня, чтобы создать динамический массив из массива классов.

var s = 0;
var songWriters = new SongWriterDetails[1];
foreach (var contributor in Contributors)
{
    Array.Resize(ref songWriters, s++);
    songWriters[s] = new SongWriterDetails();
    songWriters[s].DisplayName = contributor.Name;
    songWriters[s].PartyId = contributor.Id;
    s++;
}

Ответ 13

Используйте общий список (System.Collections.Generic.List).