Структура Данных Списка Эффективность C#
В данный момент я использую List<short> в качестве буфера для хранения вещей на некоторое время, пока вычисление производится для каждого значения на основе других значений ниже по буферу. Затем я понял, что это, вероятно, не очень эффективно, поскольку мне сказали, что List<> - это связанный список, поэтому каждый раз, когда я делаю whatever = myList[100];, бедняжке приходится сначала прыгать вниз по всем другим узлам, чтобы добраться до нужного мне значения. Я не хочу использовать обычный массив, потому что у меня есть множество Add() и Remove()S, разбросанных в других места в коде. Поэтому мне нужен класс, который наследует IList<T> , но использует обычную структуру данных массива. Кто-нибудь знает класс в .net, который работает таким образом, чтобы мне не пришлось писать свой собственный? Я пробовал использовать ArrayList, но он не универсальный!
4 ответов:
Нет,
List<T>- это общая коллекция, а не связанный список. Если вам нужно добавить и удалить функциональность, тоList<T>- это реализация, которую большинство людей используют по умолчанию.
List<T>не использует реализацию связанного списка. Внутренне он использует массив, так что это, кажется, именно то, что вам нужно. Обратите внимание, что, поскольку это массив, удаление/вставка может быть дорогостоящей операцией в зависимости от размера списка и позиции удаляемого/вставляемого элемента - O(n). Однако, не зная больше о том, как вы его используете, трудно рекомендовать лучшую структуру данных.Цитирование из раздела комментариев документаdocs .
Класс List (T) является универсальным эквивалентом класса ArrayList. Он реализует универсальный интерфейс IList(T), используя массив, размер которого динамически увеличивается по мере необходимости.
List<T>поддерживается массивом, а не связанным списком. Индексированные обращения aList<T>происходят в постоянное время.
В дополнение к правильному ответу 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.
Comments