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





Если вы начнете с Документ 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.
Хеш-карты
Это структура данных, которая позволяет хранить пары ключ-значение. Учитывая Ключ, который можно каким-либо образом упорядочить, вы можете вставить значение. Простым примером может быть список студентов, где ключ - это идентификатор студента, а значение - имя студента.
Списки произвольного доступа
Списки произвольного доступа используются для хранения длинного списка объектов, к которым должен осуществляться случайный доступ (т.е. вы хотите получить доступ к n-му элементу за время O (1)). Это нехорошо, если вы хотите вставлять / удалять элементы в середине списка, так как это потребует перетасовки всего списка, что может занять некоторое время.
Связанные списки и аналогичные
Связанные списки хороши, если вы не хотите получать доступ к элементам в середине, так как это займет время O (N). Это здорово, если вы хотите вставить / удалить элементы посередине, поскольку это требует изменения всего лишь нескольких указателей.
Очереди и стеки немного специализированы в том смысле, что они оптимизированы для поведения FIFO и FILO (First-In-First-Out и First-In-First-Out соответственно).
Разве хэш-карта не является списком с произвольным доступом?
Вам следует взять книгу об основных структурах данных. Это одна и та же теория независимо от языка.
Краткое объяснение:
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)
Это не все списки, хотя все они коллекции. Вот краткое изложение.
Неуниверсальные коллекции (API в терминах object. Типы значений заключены в рамку.
В основном они находятся в пространстве имен System.Collections:
Общие коллекции. (Строго типизированный API не будет упаковывать типы значений (при условии подходящего T).
В основном это в System.Collections.Generic пространство имен:
Возможно, самая важная коллекция интерфейс - это IEnumerable (и IEnumerable <T>). Это представляет собой последовательность элементов так же, как Stream представляет последовательность байтов. Нет произвольного доступа, только прямое чтение. LINQ to Objects основан на этом, и практически все типы коллекций реализуют его.
Также есть System.Collections.Specialized с другими вкусностями, такими как StringDictionary и NameValueCollection.
@Hafthor: Да, хотя большинство из них несколько устарели из-за дженериков.
Очень красивый список List <Collection Types>, который вы собрали. Все, что я когда-либо использовал, находится там.
В дополнение к отличным ответам, есть еще несколько коллекций, доступных через Библиотека общих коллекций C5. Документация (также на их сайте) может помочь при принятии решения о том, что использовать в зависимости от ваших требований.
В MSDN есть статья под названием Выбор класса коллекции, которую я считаю очень полезной при попытке выяснить, какую коллекцию использовать в той или иной ситуации.
У вас есть ссылка на устаревание?