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

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

Ответов (11)

Решение

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

Например:

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

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

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

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

Используйте ArrayList if в .NET 1.x или List<yourtype> if в .NET 2.0 или 3.x.

Ищите их в System.Collections и System.Collections.Generics .

Use List<> to build up an 'array' of unknown length.

Use List<>.ToArray() to return a real array, and not a List .

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

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

Вы также можете изучить словари, если ваши данные уникальны. Это даст вам два столбца для работы.

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

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

Вкратце, используйте Коллекции и Обобщения.

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

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

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

int n = 0;
bool isInteger = int.TryPase(Console.ReadLine(), out n);
var x = new int[n,n];
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!");

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

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

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

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

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

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