Можно ли изменить размер массива после объявления?
Если нет, есть ли альтернатива массивам?
Я не хочу создавать массив размером 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()
Ответ 5
Используйте System.Collections.Generic.List
Ответ 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).