2010-07-11 2 views
5

В настоящий момент я использую List<short> в качестве буфера для хранения вещей некоторое время, пока вычисление производится для каждого значения на основе других значений, расположенных дальше в буфере. Затем я понял, что это, вероятно, не очень эффективно, так как мне сказали, что List<> является связанным списком, поэтому каждый раз, когда я делаю, бедному приходится сначала спрыгнуть со всех остальных узлов, чтобы добраться до значения, которое я хочу. Я не хочу использовать регулярный массив, потому что у меня есть грузы Add() и Remove() s в других местах кода. Поэтому мне нужен класс, который наследует IList<T>, но использует регулярную структуру данных массива. Кто-нибудь знает класс в .net, который работает таким образом, поэтому мне не нужно писать самостоятельно? Я попытался использовать ArrayList, но он не типичен!Структура списка данных C# Эффективность

+3

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

+1

'List <>' не является связанным списком. 'LinkedList <>' однако есть. Вы могли заметить это, потому что нет смысла подвергать произвольный доступ в связанном списке. – Dykam

+0

Индексированный доступ к списку - это операция O (1). – digEmAll

ответ

1

Нет, a List<T> является общей коллекцией, а не связанным списком. Если вам нужно добавить и удалить функциональность, то List<T> - это реализация большинства пользователей по умолчанию.

+0

ОК, спасибо, что моя идея о том, что список <> является связанным списком, был неправильным :( –

+0

если это случай, есть ли причина для использования регулярного массива над списком? –

+0

Для простоты, когда вы имеете дело только с фиксированным число и набор объектов – thecoop

8

List<T> не использует реализацию связанного списка. Внутри он использует массив, поэтому он, похоже, именно то, что вам нужно. Обратите внимание: поскольку это массив, Remove/insert может быть дорогостоящей операцией в зависимости от размера списка и элемента позиции, который был удален/вставлен - O (n). Однако, не зная больше о том, как вы его используете, трудно рекомендовать лучшую структуру данных.

Цитирование из раздела примечаний docs.

Класс List (T) является общим эквивалентом класса ArrayList. Он реализует общий интерфейс IList (T) с использованием массива, размер которого динамически увеличивается по мере необходимости.

2

List<T> подкрепляется массивом, а не связанным списком. Индексированные обращения List<T> происходят в постоянное время.

2

В дополнение к правильному ответу tvanfosson, если вы когда-либо не знаете, как что-то работает внутри, просто загрузите .NET Reflector, и вы точно увидите, как это реализовано. В этом случае, свертывание в индексатор из List<T> показывает нам следующий код:

public T this[int index] 
{ 
    get 
    { 
     if (index >= this._size) 
     { 
      ThrowHelper.ThrowArgumentOutOfRangeException(); 
     } 
     return this._items[index]; 
    } 
    // ... 

, где вы можете увидеть, что this._items[index] является массивом общего типа T.

+1

Поскольку Reflector больше не является бесплатным, [ILSpy] (http://ilspy.net/) и [DotPeek] (http://www.jetbrains.com/decompiler/) - это другие бесплатные альтернативы. –

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