Перечислите структуру данных эффективность C#

в данный момент я использую a List<short> как буфер для содержания вещей некоторое время, в то время как вычисление сделано к каждому значению на основе других значений далее вниз буфером. Я затем понял, что это, вероятно, не было очень эффективно, поскольку мне сказали это List<> связанный список так каждый раз, когда я делаю whatever = myList[100]; бедняжка должна спрыгнуть от всех других узлов сначала для получения до значения, которое я хочу. Я не хочу использовать эквидистантную антенную решетку, потому что у меня есть загрузки Add() и Remove()s перебрасывающийся в других местах в коде. Таким образом, мне нужен класс, который наследовался IList<T> но использует структуру данных эквидистантной антенной решетки. Кто-либо знает класс в .NET, который прокладывает себе путь так, я не должен писать свое собственное? Я пытался использовать ArrayList, но это 'не универсально!

5
задан Ed Ayers 11 July 2010 в 16:14
поделиться

4 ответа

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

1
ответ дан 18 December 2019 в 10:41
поделиться

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

Цитата из раздела «Примечания» в документах .

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

9
ответ дан 18 December 2019 в 10:41
поделиться

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

3
ответ дан 18 December 2019 в 10:41
поделиться

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

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

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

3
ответ дан 18 December 2019 в 10:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: