Масив невідомої довжини в C #


81

Я щойно почав вивчати C #, і у вступі до масивів вони показали, як встановити змінну як масив, але, схоже, при призначенні потрібно вказати довжину масиву, то що, якщо я не знаю довжину масиву масив?

Відповіді:


115

Масивам має бути призначена довжина. Щоб дозволити будь-яку кількість елементів, використовуйте Listклас.

Наприклад:

List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(11);
myInts.Count // = 3

3
List<int[]> myInts = new List<int[]>();може працювати.
Ніколас Тайлер

1
Якщо масивам Повинна бути призначена довжина, то чому я можу це зробити: String [] arr = "test; the; values; now" .Split (';'); і це просто визначає довжину? І все ж я не можу взяти той самий рядок коду і перенести оголошення змінної в інший рядок.
matthew_360

@ matthew_360 Усередині функції split масив фактично викликається із фіксованим розміром. Приклад: referenceource.microsoft.com/#mscorlib/system/…
Хатч,

Щодо вашої відповіді "Arrays must be assigned a length"- у staticметоді поза Main(), я зробив декларацію String[] tokens = nullі не ініціалізував її, але як так, що я зміг зателефонувати "Hello.World".Split('.')до неї, не отримавши System.NullReferenceExceptionпомилки?
Minh Tran

40

Використовуйте List<>для створення "масиву" невідомої довжини.

Використовуйте List<>.ToArray()для повернення реального масиву, а не a List.

var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var array = list.ToArray();

Для мене Список вирішив проблему невідомого розміру, а потім .ToArray () створив потрібний мені масив.
dev1998,

2
за допомогою System.Collections.Generic;
PodTech.io

20

Трохи довідкової інформації:

Як вже було сказано, якщо ви хочете мати динамічну колекцію речей, використовуйте List<T> . Внутрішньо Список використовує масив також для зберігання. Цей масив має фіксований розмір, як і будь-який інший масив. Як тільки масив оголошено таким, що має розмір, він не змінюється. Коли ви додаєте елемент до а List, він додається до масиву. Спочатку Listпочинається з масиву, який, на мою думку, має довжину 16. Коли ви намагаєтесь додати 17-й елемент до List, відбувається те, що виділяється новий масив, який (я думаю) вдвічі перевищує старий. , отже 32 позиції. Потім вміст старого масиву копіюється в новий масив. Отже, поки aList може здаватися динамічним для зовнішнього спостерігача, всередині він також повинен відповідати правилам.

І як ви могли здогадатися, копіювання та розподіл масивів не є безкоштовними, тому потрібно прагнути мати якомога Listменше таких масивів, і для цього ви можете вказати (у конструкторі ) початковий розмір масиву, що в ідеальному сценарії просто достатньо велике, щоб вмістити все, що ти хочеш. Однак це мікрооптимізація, і навряд чи це колись для вас буде важливо, але завжди приємно знати, що ви насправді робите.


1
Це саме та інформація, яку я шукав. Спот і набагато інформативніший, ніж більшість інших відповідей. +1
Керрі Кендалл

16

Ви можете створити масив із розміром, встановленим змінною, тобто

int size = 50;
string[] words = new string[size]; // contains 50 strings

Однак цей розмір згодом не може змінитися, якщо ви вирішите, що вам потрібно 100 слів. Якщо вам потрібно, щоб розмір був справді динамічним, вам потрібно буде використовувати інший тип структури даних. Спробуйте List.


Усі вони мають значення null. Спробуйте string[] words = new string(',', size - 1).Split(',');зараз вони ініціалізовані за допомогою "".
Bitterblue

3

Використовуйте ArrayListif у .NET 1.x, або List<yourtype>if у .NET 2.0 або 3.x.

Шукайте їх у System.Collectionsта System.Collections.Generics.


2

Ви також можете захотіти переглянути словники, якщо ваші дані унікальні. Це дасть вам два стовпці для роботи.

Ім'я користувача, загальний рахунок

це дає вам багато вбудованих інструментів для пошуку та оновлення лише значення.


1
var yummy = new List<string>();
while(person.FeelsHappy()) {
    yummy.Add(person.GetNewFavoriteFood());
}
Console.WriteLine("Sweet! I have a list of size {0}.", list.Count);
Console.WriteLine("I didn't even need to know how big to make it " +
    "until I finished making it!");


1

У двох словах, будь ласка, використовуйте колекції та дженерики.

Це обов’язково для будь-якого розробника C #, варто витратити час, щоб навчитися :)


1

Як детально описано вище, загальний список <> є найкращим способом зробити це.

Якщо ви застрягли в .NET 1. *, тоді вам доведеться використовувати клас ArrayList. Тут немає перевірки типу компіляції, і ви також повинні додати кастинг - безладний.

У наступних версіях також реалізовані різні варіанти - включаючи варіанти, безпечні для потоків.


1

Якщо вам дійсно потрібно використовувати масив замість списку, тоді ви можете створити масив, розмір якого обчислюється під час виконання приблизно так ...

наприклад, я хочу двовимірний масив розміром n на n. n буде отримано під час виконання від користувача

int n = 0;
bool isInteger = int.TryPase(Console.ReadLine(), out n);
var x = new int[n,n];

так само для одновимірного масиву я напишу: var x = new int [n];
Ken Janka
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.