Вы не сказали, какой язык вы использовали раньше, но я чувствую себя довольно уверенно, говоря, что если вы считаете, что массив был единственным доступным, то вы, вероятно, ошиблись.
C ++, например, изначально поддерживает только массивы «коллекций» (здесь «коллекции» используются очень свободно), но с добавлением указателей вы можете реализовать эквивалент для любой структуры данных коллекций, доступной в .Net. Фактически, если вы заглянете в стандартную библиотеку шаблонов C ++, вы найдете стандартные реализации для большинства общих структур.
Причиной дополнительных структур является то, что массив не всегда или даже часто является наиболее подходящей структурой для сбора данных. Он имеет ряд ограничений, которые могут быть решены одной или другой коллекцией, и, используя эти разные коллекции, вы часто можете получить намного большую производительность из намного меньше кода и уменьшить вероятность есть ошибка в реализации вашей структуры данных.
Решая, какой тип коллекции использовать, вам нужно посмотреть, как она будет использоваться Большинство из нас . Например, ожидается ли, что все объекты в коллекции принадлежат к одному типу, унаследованы от одного типа или какого-либо другого типа? Вы собираетесь часто добавлять и удалять предметы? Если да, будете ли вы всегда выдвигать / вставлять, ставить в очередь / удалять элементы или вам нужно добавлять элементы в определенные места? Будете ли вы искать конкретные элементы по ключу, индексу или обоим? Если по ключу, как определяется ключ?
Некоторые из наиболее распространенных коллекций:
List<T>
, вероятно, следует использовать в большинстве ситуаций, в которых вы привыкли использовать массив. Он поддерживает поиск по индексу, используя тот же синтаксис, что и массив, с производительностью, приближающейся к производительности массива, он строго типизирован и делает его очень простым для добавления или удаления элементов и очень быстрым для добавления или удаления элементов ( вставка в определенную позицию намного медленнее).
LinkedList<T>
должно звучать знакомо, если вы прошли какое-либо официальное обучение информатике. Он использует синтаксис, аналогичный списку, но оптимизируется по-другому: поиск выполняется медленнее, поскольку он требует обхода списка, а добавление или удаление элемента в определенную позицию может быть намного быстрее.
Dictionary<TKey, TValue>
использует синтаксис, аналогичный List<T>
, но вместо индекса массива вы вводите значение ключа в скобках. Словари хороши тем, что поиск определенных элементов по ключу считается очень быстрым , в том смысле, что независимо от того, сколько элементов в Словаре, всегда будет требоваться примерно одинаковое количество времени, чтобы найти тот, который вам нужен .
SortedList<TKey, TValue>
работает во многом как словарь, за исключением того, что при его переборе возвращаются элементы, отсортированные по ключу. Тем не менее, вы не можете искать n-й элемент без предварительной итерации всех элементов перед ним.
KeyedCollection
часто упускается из виду, потому что он скрыт в другом пространстве имен от некоторых других коллекций, и вам необходимо реализовать (очень простую) функцию для его использования. Он также работает как словарь, с добавлением, что он поддерживает легкий поиск по индексу. Обычно используется, когда ключом для элемента является простое свойство самого элемента.
Не забудьте старые резервные копии: Stack
и Queue
. Опять же, если у вас есть какое-либо формальное образование в области компьютерных наук, у вас уже должно быть довольно хорошее представление о том, как они работают, основываясь на их именах.
Наконец, большинство из этих коллекций (включая массив!) Реализуют набор общих интерфейсов. Эти интерфейсы очень полезны, так как вы можете написать программу для интерфейса, а не для определенной коллекции, и тогда ваша функция может принять любую коллекцию , которая реализует этот интерфейс. Например, следующий код будет работать независимо от того, передаете ли вы строковый массив, List<string>
или любой другой IEnumerable<string>
:
void WriteToConsole(IEnumerable<string> items)
{
foreach (string item in items)
{
Console.WriteLine(item);
}
}
Другие интерфейсы, на которые стоит обратить внимание: IList<T>
, ICollection<T>
и IQueryable<T>
.