2010-11-04 6 views
0

Каков наилучший способ построения массива?C# Array Builder?

Я пишу метод, который добавляет кучу материала в массив (из строк), а затем возвращает его. Прямо сейчас, я только что использовал List<string>, а затем .Add материал, а затем верните list.ToArray(). Я не знаю длину массива заранее (если, конечно, я не использую алгоритм с двумя проходами, как раз для вычисления размера). Это хороший способ сделать это, или есть более эффективный способ?

PS: Я не хочу давать перечислимый.

ответ

3

Если вы хотите построить массив неизвестного размера, ваш текущий подход идеально подходит. Просто добавьте элементы в List<T> и позвоните по телефону ToArray() в конце.

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

Например, если вы подозреваете, что вы будете иметь около 100 элементов, вы бы лучше делать:

var temporaryList = new List<string>(120); 

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

+0

У меня есть верхняя граница, следует ли использовать это? Он редко достигает этой верхней границы (вероятно, ближе к n/2 или n/3). – mpen

+0

@Mark: для его использования будет более эффективным, чем для перераспределения - он будет выделять один дескриптор на элемент спереди, хотя - так, если верхняя граница находится в миллионах, это может быть не стоит того , (Как правило, он начинается с малого и умножается на 2x каждый раз, когда он перераспределяется - использование верхней границы обычно является лучшим вариантом) –

+3

n/2 - хороший выбор, так как это только одно расширение от максимума. Конечно, это не заменяет фактические измерения, которые понадобятся в случае очень больших списков. – codekaizen

0

Я бы предположил, что это проблема интерфейса. Вместо того, чтобы возвращать массив, верните либо IEnumberable<string>, либо IList<string> (массив реализует IList<T>, поэтому из детали реализации массив и List<T> будут неотличимы).

Если вы застряли с массивом в интерфейсе и не знаете размер заранее, ваше существующее решение является лучшим решением, о котором я знаю.