Где я могу узнать о различных типах списков.NET?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

29
задан hawbsl 12 November 2010 в 10:01
поделиться

10 ответов

Это не все списки, хотя они - все наборы. Вот быстрая сводка.

Неуниверсальные наборы (API с точки зрения object. Типы значений упаковываются.

Они находятся главным образом в Система. Наборы пространство имен:

  • ArrayList: список объектов, поддержанных массивом. Быстро случайный доступ для чтения-записи. Быстро добавьте к заключительной части, , если буферу не нужно изменение размеров.
  • Хеш-таблица : Карта от ключа до значения. Ключи уникальны, значения не должны быть. Использует метод GetHashCode для достижения около O (1) доступ для чтения-записи (кроме противных случаев, где все объекты имеют тот же хеш или восстановление потребностей запоминающего устройства). Итерация по парам ключ/значение дает непредсказуемое распоряжение. (Ну, эффективно непредсказуемый.)
  • SortedList: Как Хеш-таблица, но записи всегда возвращаются в отсортированном по ключу порядке. Сохраненный как список пар ключ/значение.
  • Стек : в обратном порядке набор
  • Очередь : набор метода "первым пришел - первым вышел"
  • Массив : фиксированный размер O (1) произвольный доступ; неуниверсальный, но имеет формы со строгим контролем типов также

Универсальные наборы. (API со строгим контролем типов, не упакует типы значения (принимающий подходящий T).

Они находятся главным образом в Система. Наборы. Универсальное пространство имен :

  • List< T>: Как ArrayList
  • Dictionary< TKey, TValue> : как Хеш-таблица
  • SortedList< TKey, TValue> : как SortedList
  • SortedDictionary< TKey, TValue> : как SortedList, но сохраненный как дерево пар ключ/значение, которое дает лучшую производительность во многих ситуациях. См. документы для большего количества детали.
  • LinkedList< T>: Двунаправленный связанный список (быстрый доступ к голове и хвосту)
  • Stack< T>: Как Стек
  • Queue< T>: Как Очередь
  • ReadOnlyCollection< T>: Как List< T>, но высказывание мнения только для чтения

Возможно самый важный набор интерфейс IEnumerable IEnumerable< T>). Это представляет последовательность объектов во многом как Поток, представляет последовательность байтов. Нет никакого произвольного доступа, просто вперед читающего. LINQ к Объектам основан на этом, и в значительной степени все типы набора реализуют его.

32
ответ дан Jon Skeet 28 November 2019 в 01:32
поделиться

Необходимо забрать книгу о структурах основных данных. Это - та же теория независимо от языка.

короткое объяснение А:

  • Array: (как в, например, int[] myArray) - статический массив, который может использоваться, когда набор никогда не изменяется (Вы не можете добавить или удалить объекты в нем, но можно изменить значения отдельных объектов)
  • ArrayList: массив/список общего назначения, который позволяет относительно быстрое перечисление, а также прямой доступ. Этот список может вырасти автоматически, поскольку Вы добавляете объекты, но так как он только хранит Object, необходимо редко использовать его из-за проблем безопасности типов и производительности.
  • List<T>: Универсальная версия вышеупомянутого ArrayList. Это обеспечивает хороший баланс между производительностью и гибкостью и должно использоваться почти всегда, когда у Вас есть динамический плоский список объектов. (Новый в.NET 2.0)
  • Hashtable: Работы как плоский список, но вместо того, чтобы индексировать его с целыми числами, это может быть индексировано с помощью любого объекта. Стоящий замечания то, что нет никакого "порядка" в хэш-таблице.
  • Dictionary<T>: Универсальная версия Хеш-таблицы. Используйте это в.NET 2.0 и выше вместо Хеш-таблицы по тем же причинам, как с ArrayList по сравнению с Упоминают выше.
  • Stack<T>: Обеспечивает тип первым пришел - последним вышел списка. Объект, который Вы добавили в последний раз, будет объектом, который Вы получаете сначала, когда Вы выбираете что-то.
  • Queue<T>: Предоставляет список метода "первым пришел - первым вышел". Думайте о нем как о трубе, где Вы вставляете объекты в одном конце и выбираете их в другом конце. Обычно используемый для передачи сообщений между, например, потоков.

В целом, необходимо использовать универсальные наборы для почти всего, что Вы делаете в.NET 2.0 и выше. Вы получите полную безопасность типов (по сравнению с, например, ArrayList и HashTable), и они намного быстрее для типов значения (целые числа, структуры, плавания и т.д.) по сравнению с не универсальный onces.

, Если у Вас есть список объектов, которые никогда не будут изменяться, или Вы не нуждаетесь/хотите в гибкости List<T>, можно, конечно, использовать массив, так как она имеет наименьшее количество суммы издержек их всех.

рекомендация А при возврате набора из открытого метода или свойства состоит в том, чтобы бросить его к менее гибкому интерфейсу. Таким образом, если у Вас есть Список, который Вы возвращаете, Вы могли бросить его к IEnumerable<int>, что означает, что Ваш потребитель не может добавить объекты к нему (если, конечно, он не бросает его назад, но все еще признак пользователям). Кастинг его также даст Вам гибкость для изменения базового datastructure позже при поддержании устойчивости API. Вы могли также выбрать ICollection<int> или IList<int> для представления немного большей функциональности, но хранения фактической скрытой структуры данных.

6
ответ дан Isak Savo 28 November 2019 в 01:32
поделиться

карты Хеша

  • Словарь
  • Хеш-таблица (Неуниверсальная)

, Это - структура данных, которая позволяет Вам сохранять пары "ключ-значение". Учитывая Ключ, который имеет некоторый способ быть заказанным, можно вставить Значение. Простым примером мог быть список студентов, где Ключ является студенческим идентификатором и значением студенческое имя.

списки Произвольного доступа

  • Список
  • ArrayList (Неуниверсальный)

, списки Произвольного доступа используются для хранения длинного списка объектов, к которым нужно получить доступ случайным образом (т.е. Вы хотите получить доступ к n'th элементу в O (1) время). Не хорошо, если бы Вы хотите вставить/удалить элементы посреди списка, так как это потребовало бы, чтобы весь список был переставлен, вокруг которого мог занять время.

Связанные списки и подобный

  • очередь LinkedList
  • Стек

Связанные списки являются большими, если бы Вы не хотите получать доступ к элементам в середине, так как это взяло бы O (N) время. Замечательно, если Вы хотите вставить/удалить элементы в середине, так как это только включает изменение нескольких указателей.

Очереди и Стеки немного специализированы, в котором они оптимизированы для FIFO и поведения FILO (Метод "первым пришел - первым вышел" и Метод "первым пришел - первым вышел" соответственно).

5
ответ дан Mats Fredriksson 28 November 2019 в 01:32
поделиться

Для рассуждения о более раннем ответе tobsen Библиотека Универсального набора C5 имеет большое количество, ну, в общем, наборов. Я опишу некоторых из них здесь:

Очередь/Стек

  • CircularQueue<T>: Этот класс обеспечивает строго функциональность Стека и Очередь. Также, эффективный O (1) доступ к любому объекту в Стеке/Очереди является доступным использованием индексатора: cq[0] (где 0 самый старый объект, рядом с быть исключенным из очереди, в последний раз быть вытолканным).

Списки

Примечание: ArrayList и LinkedList может также функционировать как Очередь/Стеки

  • ArrayList<T>: Подобный его дубликату в System.Collections.Generic (SCG), List<T>, это поддерживается массивом, гарантируя O (1) индексация, но худший случай O ( n) вставка. O ( n) для нахождения объекта.
  • LinkedList<T>: Подобный его дубликату SCG.LinkedList<T>. Используя двунаправленный связанный список, гарантии O (1) вставка, но худший случай O ( n) индексирующий (на практике, пропорционально расстоянию или от головы или от хвоста списка). Также O ( n) для нахождения объекта. Сортировка использует стабильную Сортировку слиянием.
  • HashedArrayList<T>: Подобный ArrayList<T> выше, но не позволяет дубликаты. Польза, которую Вы извлекаете в ответ, - то, что время для нахождения объекта и его индекса уменьшается до [1 152] O (1).
  • HashedLinkedList<T>: Подобный LinkedList<T> выше, но не позволяет дубликаты. Как прежде, время для нахождения объекта уменьшается до [1 153] O (1), но время для нахождения его индекса остается O ( n).
  • WrappedArray<T>: Довольно подобный эти ArrayList<T>, это действует как обертка вокруг массива, который реализует C5.IList<T>, но выдает исключения, если попытка предпринята для изменения набора (IsFixedSize, верно и Add, Remove, Insert не работают; Sort, Shuffle, и Reverse делают, однако, поскольку они существуют операции).

Списки также обеспечивают функциональность "Представления", которая представляет сегмент базового списка, позволяя локальным операциям быть выполненной. Используя шаблоны, предлагаемые в книге C5, операции могут быть выполнены с помощью представлений, которые эффективны и в списках массива и в связанных списках. Любая операция списка может также быть выполнена на представлении, ограничив их эффект подмножеством базового списка.

Отсортированные Наборы

  • SortedArray<T>: Подобный ArrayList<T> за исключением того, что это сохраняет свои объекты отсортированными и не позволяет дубликаты. Обратите внимание, что случайные вставки и удаления на этом наборе являются медленными. Этот набор является лучшим, если количество объектов является маленьким или редко изменяемое, но часто получаемое доступ индексом объекта или значением.
  • TreeSet<T>: Использует красно-черную древовидную структуру для хранения объектов отсортированными. Как набор, это не позволяет дубликаты. Доступ значением индекса или объекта и вставкой/удалением берет O ( n журнала).
  • TreeBag<T>: Использует красно-черное дерево, сохраняя объекты отсортированными. Как сумка, это позволяет дубликаты, но не хранит дубликаты в дереве, довольно остающиеся дубликаты путем подсчета.

И TreeSet<T> и TreeBag<T> обеспечивают способность эффективно сделать "снимки" или персистентные копии дерева в [1 158] O (1), позволяя повторение по снимку при изменении базового дерева. Обратите внимание, что каждый снимок на дереве добавляет потерю производительности к обновлениям дерева, но эти эффекты уходят, когда снимок расположен.

Наборы Хеша

  • HashSet<T>: набор с помощью простой хэш-таблицы для устройства хранения данных. Доступ значением объекта берет O (1). Как набор, это не позволяет дубликаты. Обеспечивает функцию BucketCostDistribution(), который может помочь сказать, что Вы определяете эффективность функции хэш-кода объектов.
  • HashBag<T>: Подобный эти HashSet<T>, но имеет семантику сумки, означая, что дубликаты позволяются, но дубликаты только хранятся путем подсчета.

Приоритетная Очередь

  • IntervalHeap<T>: Предоставляет приоритетной очереди. Открытие, которое максимум и минимум O (1) операции, удаление максимума, минимума, добавления и обновления, O ( n журнала) операции. Позволяет дубликаты путем хранения их явно (не путем подсчета).

Словари

  • HashDictionary<H,K>: Подобный эти SCG.Dictionary<H,K>, обеспечивает доступ записи, вставку и удаление в [1 163] O (1). Также обеспечивает BucketCostDistribution() функция как [1 138] выше. Не гарантирует никакого конкретного порядка перечисления.
  • TreeDictionary<H,K>: Подобный эти SCG.SortedDictionary<H,K>, предоставляет постоянно сортируемый словарь с помощью красно-черного дерева. Доступ записи, вставка и удаление берут O ( n журнала). Гарантии, что перечисление словаря выполняет приказ, определенный ключевым компаратором.

Защищенные Наборы

Также, C5 также предлагает "охраняемые" наборы, который эффективно действует как обертка только для чтения, препятствуя тому, чтобы набор был изменен. Объекты в наборе все еще могут быть изменены, но объекты не могут быть добавлены, удалены или вставлены в набор.

А долго отвечают, но полный на библиотеках C5 различные наборы в Вашем распоряжении. Я нашел, что библиотека C5 является большой и часто использует его в моем собственном коде, заменяя общий заголовок C#:

using C5;
using SCG = System.Collections.Generic;
6
ответ дан Marcus Griep 28 November 2019 в 01:32
поделиться

Если Вы запускаете в MSDN doco для Системы. Наборы , можно выполнить развертку в отдельные типы набора для получения дополнительной информации о тех "списках" и как использовать их. Например, doco для Hashtable говорит, "Представляет набор пар ключ/значение, которые организованы на основе хэш-кода ключа".

существует также хорошее обсуждение Системы. Наборы. Универсальный в Дженерики Понимания .

2
ответ дан Robert S. 28 November 2019 в 01:32
поделиться

List< T> является поддающимся сортировке, но не рекомендуемый быть представленным публично.

Collection< T> основное, никакой набор оборок.

Dictionary< T> набор пар "ключ-значение" (во многом как старая хеш-таблица, но теперь универсальный).

KeyedCollection< T> словарь, где ключ может быть определен от значения (это - краткий обзор, таким образом, необходимо наследоваться ему и поддерживать функцию GetKey)

ReadOnlyCollection< T> специальный набор, где содержание не может быть изменено.

ArrayList и HashTable являются в основном устаревшим запуском с.NET 2.0.

2
ответ дан Jon B 28 November 2019 в 01:32
поделиться

В дополнение к большим ответам до сих пор, существуют еще некоторые Наборы, доступные через Библиотека Универсального набора C5 . Документация (также на их сайте) может помочь при решении, что использовать в зависимости от requirments.

2
ответ дан tobsen 28 November 2019 в 01:32
поделиться

Это примеры различных типов общие структуры данных . Эти структуры данных используются повсеместно в разработке программного обеспечения.

0
ответ дан yfeldblum 28 November 2019 в 01:32
поделиться

Intellisense покажет Вам краткое описание каждого если Вы просто тип System.collections.Generic. в окно кода. Не забывайте запаздывающий период. О, и существует также System.Collections.ObjectModel.. Оттуда необходимо быть в состоянии получить больше информации о чем-либо, что выглядит многообещающим из MSDN.

-3
ответ дан Joel Coehoorn 28 November 2019 в 01:32
поделиться

В MSDN есть статья под названием Выбор класса коллекции , которая мне очень полезна, когда я пытаюсь выяснить, какой тип коллекции использовать в данной ситуации.

1
ответ дан 28 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

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