2009-10-14 2 views
3

Я хочу знать, что такое начальный размер ArrayList в C#?Каков первоначальный размер ArrayList в C#?

+5

Это может указывать на очевидное, но если вы не используете .NET 1.x, вы должны использовать List . –

+1

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

ответ

12

0. Смотри ниже.

16. (Я должен добавить символы к этому ответу, так как 18 символов минимальны)

Edit, Oops - начальная мощность 16. Начальный размер, конечно, 0, потому что она пуста. Придется научиться читать. Или вам нужно научиться формировать свои вопросы. ;)

Редактировать снова; Начальная емкость ArrayList в .NET 1.0 равна 16. В 2.0 это было 4, а теперь - с .NET 3.5 - начальная capacty была понижена до 0. У меня нет объяснения, почему, ты.

При добавлении первого элемента в список емкость будет установлена ​​на 4. Там, после, каждый раз, когда arraylist.Count eq arraylist.Capacity, емкость удваивается.

+0

Это объясняет мои различные наблюдения здесь. Weird. – Joey

+1

У вас есть источник/ссылка для размеров емкости .NET 2.0 и 3.5? Интересно узнать больше об этом ... Я думал, что все равно 16. –

+0

Нет, не могу найти его в MSDN или объяснении MS для этого. –

5

ПРИМЕЧАНИЕ: Следующие, по-видимому, справедливы только для .NET 3.5; в предыдущих версиях рамки значения были разными.

По моим тестам здесь как начальный размер и мощность равны нулю:

PS> $a = new-object system.collections.arrayList 
PS> $a.Capacity 
0 
PS> $a.count 
0 

Кроме того, глядя на исходный код в отражатель, то же самое справедливо:

public virtual int Capacity 
{ 
    get 
    { 
     return this._items.Length; 
    } 
    ... 
} 

И _items получает установить на пустой object[] в ctor.

+0

Вы правы, так как начиная с .NET 3.5 начальная емкость была снижена до 0. В .NET 1.0 это было 16. Я обновил свой ответ и повышу ваш. ;) –

+1

Мне нужно узнать мне PowerShell. Это очень удобно. –

1
ArrayList list = new ArrayList(); 

размер = 0 перед добавлением элементов в массивList, означает, что нет элементов.

2

ArrayList пуст, когда вы его создали, поэтому размер равен нулю.

Если вы не застряли в каркасе 1, вы не должны использовать класс ArrayList. Вместо этого используйте строго типизированный общий класс List<T>.

0

Попробуйте сами.

int capacity = (new ArrayList()).Capacity; 

должен предоставить вам начальную емкость.

7

ArrayList начинается с Размер = 0 (поскольку он пустой) и емкость = 16.

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

Другими словами - если вы знаете, что собираетесь разместить 5000 элементов в списке, вам гораздо лучше будет инициализировать его, чтобы удерживать 5000 элементов.

Вы можете явно указать Емкость существующего arraylist, если знаете, что собираетесь вставить большое количество элементов. Вы также можете уменьшить емкость явно, но если вы установите значение Capacity < Count, вы получите исключение ArgumentOutOfRange.

+0

Очень хорошо объяснено – Quagmire

+1

Хотя каждая операция удвоения вдвое дороже предыдущей, она бывает вдвое чаще. Это приводит к тому, что амортизационная стоимость каждой вставки является постоянной, и поэтому вставка n элементов - O (n) в целом. Да, вам лучше распределить вещь на нужный размер, если она будет большой, но даже если вы этого не сделаете, общая сумма дополнительных расходов довольно мала. Другая стоимость, которую вы пренебрегаете, заключается в том, что в среднем список отходов составляет четверть от его пропускной способности. –

Смежные вопросы