Массив неизвестной длины в C#


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

11 71

11 ответов:

массивам должна быть присвоена длина. Чтобы разрешить любое количество элементов, используйте List класса.

например:

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

использовать List<> для создания "массива" неизвестной длины.

использовать List<>.ToArray() вернуться в реальный массив, а не List.

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

Вы можете создать массив с размером переменной, т. е.

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

однако этот размер не может измениться позже, если вы решите, что вам нужно 100 слов. Если вам нужно, чтобы размер был действительно динамическим, вам нужно будет использовать другую структуру данных. Попробуй List.

немного справочной информации:

как уже было сказано, Если вы хотите иметь динамическую коллекцию вещей, используйте List<T>. Внутренне, список использует массив для хранения. Этот массив имеет фиксированный размер, как и любой другой массив. Как только массив объявлен как имеющий размер, он не изменяется. При добавлении элемента в List, он добавляется в массив. Первоначально,List начинается с массива, который, как я считаю, имеет длину 16. При попытке добавить 17-й пункт List, что происходит, так это то, что новый массив выделяется, это (я думаю) в два раза больше старого, поэтому 32 элемента. Затем содержимое старого массива копируются в новый массив. Так как List может казаться динамичным для внешнего наблюдателя, внутренне он также должен соответствовать правилам.

и, как вы могли догадаться, копирование и распределение массивов не является бесплатным, поэтому следует стремиться иметь как можно меньше из них, и чтобы сделать это, вы можете указать (в конструктор List) начальный размер массива, который в идеальном сценарии достаточно велик, чтобы вместить все, что вы хотите. Тем не менее, это микро-оптимизация, и вряд ли это когда-нибудь будет иметь значение для вас, но всегда приятно знать, что вы на самом деле делаешь.

использовать ArrayList Если в .NET 1.x, или a List<yourtype> если в .NET 2.0 или 3.x.

искать их в System.Collections и System.Collections.Generics.

вы также можете посмотреть в Dictionarys если ваши данные уникальны, это даст вам два столбца для работы.

имя пользователя, общий счет

Это дает вам много встроенных инструментов для поиска и обновления только значение.

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!");

попробуйте общий список вместо массива

в двух словах, пожалуйста, используйте коллекции и дженериков.

Это обязательно для любого разработчика C#, стоит потратить время, чтобы узнать :)

Как подробно описано выше, общий список является лучшим способом сделать это.

Если вы застряли в .NET 1.* тогда вам придется использовать класс ArrayList. Это не имеет проверки типов во время компиляции, и вы также должны добавить литье - лажа.

последовательные версии также реализовали различные варианты, включая потокобезопасные варианты.

Если вы действительно должны использовать массив вместо списка, то вы можете создать массив, размер которого вычисляется во время выполнения, как так...

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

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