Я щойно почав вивчати C #, і у вступі до масивів вони показали, як встановити змінну як масив, але, схоже, при призначенні потрібно вказати довжину масиву, то що, якщо я не знаю довжину масиву масив?
Відповіді:
Масивам має бути призначена довжина. Щоб дозволити будь-яку кількість елементів, використовуйте List
клас.
Наприклад:
List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(11);
myInts.Count // = 3
"Arrays must be assigned a length"
- у static
методі поза Main()
, я зробив декларацію String[] tokens = null
і не ініціалізував її, але як так, що я зміг зателефонувати "Hello.World".Split('.')
до неї, не отримавши System.NullReferenceException
помилки?
Використовуйте List<>
для створення "масиву" невідомої довжини.
Використовуйте List<>.ToArray()
для повернення реального масиву, а не a List
.
var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var array = list.ToArray();
Трохи довідкової інформації:
Як вже було сказано, якщо ви хочете мати динамічну колекцію речей, використовуйте List<T>
. Внутрішньо Список використовує масив також для зберігання. Цей масив має фіксований розмір, як і будь-який інший масив. Як тільки масив оголошено таким, що має розмір, він не змінюється. Коли ви додаєте елемент до а List
, він додається до масиву. Спочатку List
починається з масиву, який, на мою думку, має довжину 16. Коли ви намагаєтесь додати 17-й елемент до List
, відбувається те, що виділяється новий масив, який (я думаю) вдвічі перевищує старий. , отже 32 позиції. Потім вміст старого масиву копіюється в новий масив. Отже, поки aList
може здаватися динамічним для зовнішнього спостерігача, всередині він також повинен відповідати правилам.
І як ви могли здогадатися, копіювання та розподіл масивів не є безкоштовними, тому потрібно прагнути мати якомога List
менше таких масивів, і для цього ви можете вказати (у конструкторі ) початковий розмір масиву, що в ідеальному сценарії просто достатньо велике, щоб вмістити все, що ти хочеш. Однак це мікрооптимізація, і навряд чи це колись для вас буде важливо, але завжди приємно знати, що ви насправді робите.
Ви можете створити масив із розміром, встановленим змінною, тобто
int size = 50;
string[] words = new string[size]; // contains 50 strings
Однак цей розмір згодом не може змінитися, якщо ви вирішите, що вам потрібно 100 слів. Якщо вам потрібно, щоб розмір був справді динамічним, вам потрібно буде використовувати інший тип структури даних. Спробуйте List
.
string[] words = new string(',', size - 1).Split(',');
зараз вони ініціалізовані за допомогою ""
.
Використовуйте ArrayList
if у .NET 1.x, або List<yourtype>
if у .NET 2.0 або 3.x.
Шукайте їх у System.Collections
та System.Collections.Generics
.
спробуйте загальний список замість масиву
Як детально описано вище, загальний список <> є найкращим способом зробити це.
Якщо ви застрягли в .NET 1. *, тоді вам доведеться використовувати клас ArrayList. Тут немає перевірки типу компіляції, і ви також повинні додати кастинг - безладний.
У наступних версіях також реалізовані різні варіанти - включаючи варіанти, безпечні для потоків.
Якщо вам дійсно потрібно використовувати масив замість списку, тоді ви можете створити масив, розмір якого обчислюється під час виконання приблизно так ...
наприклад, я хочу двовимірний масив розміром n на n. n буде отримано під час виконання від користувача
int n = 0;
bool isInteger = int.TryPase(Console.ReadLine(), out n);
var x = new int[n,n];
List<int[]> myInts = new List<int[]>();
може працювати.