Динамічний масив у C #


112

Чи є якийсь метод створення динамічного масиву в C #?


1
Якщо ви все-таки застрягли в старому грязі, скориставшись [] замість цього, якщо Список <>, ви можете використовувати Array.Resize (). Ось хороший приклад. dotnetperls.com/array-resize
Джан

Посилання dotnetperls.com/array-resize не працює. (FYI)
Su Llewellyn

Відповіді:


150

Погляньте на загальні списки .


13
Питання (хоч і коротке та неописне) не запитує про загальний список. Питання може бути про dynamic[] msdn.microsoft.com/en-GB/library/dd264736.aspx (масив динамічних типів) або ExpandoObject msdn.microsoft.com/ uk-нам / бібліотека /… Я міг -1 відповідь на те, щоб не згадувати про них
Люк Т О'Брайен

6
@ LukeTO'Brien, динаміка була введена в C # 4.0, який вийшов цілий рік після того, як це питання було спочатку задано. OP, ймовірно, запитував про структуру даних, що змінює розмір, на зразок en.wikipedia.org/wiki/Dynamic_array
Брайан Меррелл

6
Відповіді, що складаються лише з посилань на статті, не є корисними. Немає гарантії, що посилання залишиться активною.
JamEngulfer

@JamEngulfer Це неправда. Якщо його текст посилання був "Подивіться на це" з "цим", я погодився б з вами. Якщо ви видалите посилання та подивіться на те, що залишилося, відповідь ОП на "погляньте на загальні списки" - це багато інформації, щоб отримати будь-якого майбутнього читача гуглінг ....
Лінн Кришиться

88

Розгортання відповіді Кріса і Мігола на прикладі коду.

Використання масиву

Student[] array = new Student[2];
array[0] = new Student("bob");
array[1] = new Student("joe");

Використання загального списку. Під кришкою клас List <T> використовує масив для зберігання, але робить це таким чином, що дозволяє ефективно рости.

List<Student> list = new List<Student>();
list.Add(new Student("bob"));
list.Add(new Student("joe"));
Student joe = list[1];

2
цей приклад
напівпоганий

21
Ця відповідь краща, ніж ваша @Migol, оскільки це показує, як насправді використовувати Список <>, а не просто згадувати його як ключове слово. "наполовину погано" -> "наполовину добре" -> добре
fhugas

56

Іноді звичайні масиви віддають перевагу загальним спискам, оскільки вони зручніші (краща продуктивність для дорогих обчислень - наприклад, числових алгебр або для обміну даними з програмним забезпеченням статистики, наприклад R або Matlab)

У цьому випадку ви можете використовувати метод ToArray () після динамічного ініціювання списку

List<string> list = new List<string>();
list.Add("one");
list.Add("two");
list.Add("three");

string[] array = list.ToArray();

Звичайно, це має сенс лише в тому випадку, якщо розмір масиву ніколи не відомий і не фіксований ex-ante . якщо ви вже знаєте розмір свого масиву в якийсь момент програми , краще ініціювати його як масив фіксованої довжини. (Якщо, наприклад, ви отримуєте дані з ResultSet, ви можете підрахувати його розмір та ініціювати масив такого розміру, динамічно)


1
Не варто, поки ви використовуєте індексатор.
aaimnr

2
Ararys не є більш зручним (вони пропонують підмножину інтерфейсу List <T>) і пропонують майже таку ж продуктивність, оскільки List <T> використовує регулярний масив під ним. Ітерації для 6000000 елементів: Список / для: 1971ms масиву / для: 1864ms (Benchmark від stackoverflow.com/questions/454916 / ... )
aaimnr

9
Якщо вам доведеться передати масив інтерфейсу, то він повинен бути масивом. Набагато простіше скласти список, а потім зробити його в масив безпосередньо перед тим, як передавати його. Мені подобається ця відповідь більше за інших, тому що вона стосується питання!
Майкл Стимсон

36

List<T>для сильно набраного, або ArrayListякщо у вас є .NET 1.1 або ви хочете передавати змінні.


2

Приклад динамічного масиву:

Console.WriteLine("Define Array Size? ");
int number = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Enter numbers:\n");
int[] arr = new int[number];

for (int i = 0; i < number; i++)
{
    arr[i] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < arr.Length; i++ )
{
    Console.WriteLine("Array Index: "+i + " AND Array Item: " + arr[i].ToString());
}
Console.ReadKey();

2

Це можна зробити за допомогою динамічних об'єктів:

var dynamicKeyValueArray = new[] { new {Key = "K1", Value = 10}, new {Key = "K2", Value = 5} };

foreach(var keyvalue in dynamicKeyValueArray)
{
    Console.Log(keyvalue.Key);
    Console.Log(keyvalue.Value);
}

1

Використовуйте список масивів, який фактично реалізує масив. Спочатку він займає масив розміром 4, і коли він заповнюється, створюється новий масив з його подвійним розміром, а дані першого масиву копіюються у другий масив, тепер новий елемент вставляється у новий масив. Також ім'я другого масиву створює псевдонім першого, щоб він міг отримати доступ до того ж імені, що і попередній, і перший масив буде розміщений


1

ви можете використовувати об'єкт arraylist з колекції класу

using system.collections;
   static void main()
        {
        Arrylist arr=new Arrylist();
         }

де n ви хочете додати елемент, який ви можете використовувати

arr.add();

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.