Вы не говорили, какой язык вы использовали раньше, но я уверен, что если вы считаете, что массив был единственным, доступным, то вы, вероятно, ошибались.
C++, например, поддерживает только массивы «коллекции» изначально («коллекции» используются здесь очень слабо), но с добавлением указателей вы можете реализовать эквивалент любой структуры данных коллекций, доступной в .Net. На самом деле, если вы посмотрите в стандартной библиотеке шаблонов C++, вы найдете реализации запасов для большинства общих структур.
Причина дополнительных структур заключается в том, что массив не всегда или даже часто является наиболее подходящей структурой для использования для сбора данных. У этого есть ряд ограничений, которые могут быть решены одной коллекцией или другой, и используя эти разные коллекции, вы часто можете получить намного больше производительность из гораздо меньше кода и уменьшить вероятность того, что в вашей структуре данных возникла ошибка также.
При принятии решения о том, какой тип коллекции использовать, вы должны посмотреть, как он будет использоваться most ofen. Например, все объекты в коллекции ожидаются одного типа, унаследованные от того же типа или любого типа? Собираетесь ли вы часто добавлять и удалять элементы? Если это так, вы всегда будете нажимать/поп, элементы очереди/деактивации или вам нужно добавлять элементы в определенные места? Будете ли вы искать конкретные предметы по ключевым словам, по индексу или обоим? Если по ключу, как определяется ключ?
Некоторые из наиболее распространенных коллекций:
List<T>
, вероятно, должны быть использованы в большинстве ситуаций, когда вы привыкли использовать массив. Он поддерживает поиск по индексу с использованием того же синтаксиса, что и массив с производительностью, приближающийся к характеристикам массива, строго типизирован и делает очень легко добавлять или удалять элементы и очень быстро добавлять или портировать элементы (вставляя их в конкретный положение намного медленнее).
LinkedList<T>
должно звучать знакомо, если вы прошли профессиональную подготовку по информатике. Он использует синтаксис, аналогичный List, но оптимизирован по-разному: поисковые запросы медленнее, потому что они требуют перемещения по списку, в то время как добавление или удаление элемента в определенную позицию может быть намного быстрее.
Dictionary<TKey, TValue>
использует синтаксис, аналогичный List<T>
, но вместо индекса массива вы кладете ключевое значение в скобки. Словари велики, потому что поиск определенных предметов по ключевым словам считается очень быстрым, тем, что независимо от количества предметов в словаре он всегда будет занимать примерно такое же количество времени, чтобы найти тот, который вам нужен.
SortedList<TKey, TValue>
работает много, как словарь, за исключением того, что при повторении его элементов возвращаются отсортированные по ключу. Тем не менее, вы не можете найти n-й элемент без первого повторения всех элементов перед ним.
KeyedCollection
часто упускается из виду, потому что он скрыт в другом пространстве имен из некоторых других коллекций, и вы должны реализовать (очень легкую) функцию для его использования. Он также работает так же, как и словарь, и добавляет, что он поддерживает простой поиск по индексу. Обычно это используется, когда ключ для элемента является простым свойством самого элемента.
Не забывайте, что старые standbys: 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>
.
Некоторые вещи, которые вы можете добавить к своему отличному ответу: добавление элементов в список происходит только быстро, если вы добавите их в конце; и упомянуть LinkedList , который имеет очень быстрые вставки и удаления в любом месте, но не поддерживает элементы индексации напрямую. –
Thomas
+1 краткий ответ. –