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

Кто-нибудь знает хороший ресурс, чтобы кратко объяснить различные типы списков, доступных в C#, и когда их использование уместно?

Например, List, Hashtable, Dictionaries и т. д.

Я никогда не совсем уверен, когда мне следует использовать что.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
29
0
4 857
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Если вы начнете с Документ MSDN для System.Collections, вы можете углубиться в отдельные типы коллекций для получения более подробной информации об этих «списках» и о том, как их использовать. Например, в документации для Hashtable говорится: «Представляет собой набор пар ключ / значение, организованных на основе хэш-кода ключа».

Также есть хорошее обсуждение System.Collections.Generic в Понимание дженериков.

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

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

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

Collection <T> - это базовая коллекция без излишеств.

Dictionary <T> - это набор пар ключ-значение (очень похожий на старую хеш-таблицу, но теперь общий).

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

ReadOnlyCollection <T> - это специальная коллекция, содержимое которой нельзя изменить.

ArrayList и HashTable в основном устарели, начиная с .NET 2.0.

У вас есть ссылка на устаревание?

Pacerier 03.11.2011 05:50

Хеш-карты

  • Словарь
  • Hashtable (не общий)

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

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

  • Список
  • ArrayList (не общий)

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

Связанные списки и аналогичные

  • LinkedList
  • Очередь
  • Куча

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

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

Разве хэш-карта не является списком с произвольным доступом?

Pacerier 03.11.2011 05:51

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

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

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

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

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

Рекомендация при возврате коллекции из общедоступного метода или свойства - привести ее к менее гибкому интерфейсу. Поэтому, если у вас есть список, который вы возвращаете, вы можете преобразовать его в IEnumerable<int>, что означает, что ваш потребитель не может добавлять в него элементы (если, конечно, он не отбрасывает его обратно, но это все еще указание для пользователей). Приведение его также даст вам гибкость для изменения базовой структуры данных позже, сохраняя при этом стабильность API. Вы также можете выбрать ICollection<int> или IList<int>, чтобы раскрыть немного больше функциональных возможностей, но сохранить фактическую структуру данных скрытой.

Это хороший список = D Кстати, не могли бы вы добавить в SortedList и SortedDictionary, потому что они обычно действительно сбивают с толку (даже после ответа JonSkeet)

Pacerier 03.11.2011 05:55
Ответ принят как подходящий

Это не все списки, хотя все они коллекции. Вот краткое изложение.

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

В основном они находятся в пространстве имен System.Collections:

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

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

В основном это в System.Collections.Generic пространство имен:

Возможно, самая важная коллекция интерфейс - это IEnumerableIEnumerable <T>). Это представляет собой последовательность элементов так же, как Stream представляет последовательность байтов. Нет произвольного доступа, только прямое чтение. LINQ to Objects основан на этом, и практически все типы коллекций реализуют его.

Также есть System.Collections.Specialized с другими вкусностями, такими как StringDictionary и NameValueCollection.

Hafthor 13.10.2008 20:45

@Hafthor: Да, хотя большинство из них несколько устарели из-за дженериков.

Jon Skeet 13.10.2008 20:48

Очень красивый список List <Collection Types>, который вы собрали. Все, что я когда-либо использовал, находится там.

stephenbayer 13.10.2008 23:10

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

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

Другие вопросы по теме