Как работать с 1D массивом. Если я не могу предсказать его длину? - PullRequest
0 голосов
/ 04 апреля 2009

Дублирование

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

Как инициализировать строку [] без необходимости инициализации длины? Я хочу, чтобы это был динамический массив, поэтому, когда я что-то добавляю, длина увеличивается, а исключение не увеличивается?

Должен ли я просто использовать какой-то список?

Ответы [ 7 ]

6 голосов
/ 04 апреля 2009

Если вам нужен массив неизвестной длины strings, используйте List<T> из пространства имен System.Collections.Generic.

List<string> myList = new List<string>();
myList.Add("First");
myList.Add("Second");
myList.Add("Third");
myList.Count // = 3

При этом используется закулисный массив фиксированного размера, но он скрывает тот факт, что он увеличит массив и переместит все элементы, когда у него закончится пространство.

3 голосов
/ 04 апреля 2009

Список будет делать то, что вы хотите. У него есть метод ToArray () , который будет возвращать массив, когда вы закончите добавлять элементы (если вам все еще нужен массив).

1 голос
/ 04 апреля 2009

Ну, в Фортране вы можете использовать ALLOCATE.

1 голос
/ 04 апреля 2009

Какой язык?

C #, Java и многие другие языки высокого уровня имеют ArrayList структуру данных (или что-то подобное), которая позволяет добавлять и удалять элементы без установки определенного размера.

1 голос
/ 04 апреля 2009

Массивы имеют фиксированную длину в большинстве языков. Вы должны использовать динамический тип данных, такой как список, если вам нужна динамическая длина.

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

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

UPDATE

Для C # классы коллекции находятся в пространстве имен System.Collections. Вы должны сосредоточиться на общих классах в System.Collections.Generic, если это возможно. В твоем случае лучше всего подойдет List<String>. Но также могут быть Stack<String> или Queue<String>.

1 голос
/ 04 апреля 2009

Я думаю, что многие языки будут выделять весь массив как блок заранее. Вам может понадобиться использовать класс-оболочку, который предоставляет эту функциональность. В отсутствие указанного языка, например Java и C ++, int [] будет непрерывным блоком памяти. Вы должны будете выделить новый блок и скопировать старое содержимое, или использовать оболочку, которая управляет этим для вас, делая то же самое или используя указатели на объекты. Это был бы ArrayList или похожий в Java.

0 голосов
/ 04 апреля 2009

Если вы используете C #, используйте ArrayList. Он динамически расширяется по мере необходимости и может содержать что угодно (это может быть как хорошо, так и плохо). Так что да, вы должны использовать какой-то список. Также не забудьте включить это с помощью оператора:

using System.Collections;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...