Классы коллекций в C#

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

Приложения, предназначенные для платформы .NET Framework версии 2.0 или более поздней, должны использовать универсальные классы коллекций в пространстве имен System.Collections.Generic, обеспечивающие повышенную безопасность типа и эффективность по сравнению с нестандартными аналогами.

Классы коллекций имеют следующие свойства

Коллекции и структуры данных

Связанные данные могут обрабатываться более эффективно, если они объединены в коллекцию. Вместо того чтобы писать код для обработки каждого отдельного объекта, можно использовать один и тот же код для обработки всех элементов коллекции.

Для управления коллекцией используйте классы из пространств имен System.Collections,System.Collections.Generic и System.Collections.Concurrent для добавления, удаления и изменения либо отдельных элементов коллекции, либо диапазона элементов. Коллекцию можно скопировать целиком в другую коллекцию.

Некоторые классы System.Collections предоставляют возможность сортировки, и большинство из них индексированы. Управление памятью осуществляется автоматически, а вместимость коллекции увеличивается по мере необходимости. Синхронизация обеспечивает потокобезопасность при доступе к членам коллекции. Любой классSystem.Collections может создать свой собственный нумератор, облегчающий выполнение итерации элементов.

Определение коллекций

Коллекция представляет собой набор объектов схожих типов, сгруппированных вместе.

Объекты любого типа могут быть сгруппированы в одну коллекцию типаObject, чтобы воспользоваться преимуществами конструкций, свойственных языку. Например, оператор foreach языка C# предполагает, что все объекты коллекции имеют один и тот же тип.

Однако в коллекции типаObject происходит дополнительная индивидуальная обработка элементов, к примеру, упаковка и распаковка или преобразования, что влияет на производительность коллекции. Упаковка и распаковка обычно происходят при сохранении или извлечении типа значений из коллекции типаObject.

Универсальные коллекции, такие какList<T> и строго типизированные неуниверсальные коллекции, такие какStringCollection, позволяют избежать проблем с производительностью, если тип элемента является типом, для которого предназначена коллекция (например, сохранение или извлечение строк из StringCollection). Кроме того, при добавлении элемента в строго типизированную коллекцию выполняется автоматическая проверка типа такого элемента. По этим причинам настоятельно рекомендуется использовать универсальные коллекции классов всегда, когда это возможно.

Рассмотрим пример работы с коллекцией.

КлассArrayList

Реализует интерфейсIList с помощью массива с динамическим увеличением размера до нужного значения.

Пространство имен:System.Collections

Сборка: mscorlibmscorlib.dll)

Сортировка спискаArrayList не гарантируется. Необходимо отсортировать списокArrayList перед выполнением операций (таких, какBinarySearch), для которых требуется отсортированный списокArrayList.

Емкость коллекцииArrayList — это количество элементов, которое может вместить коллекция ArrayList. Когда в коллекцию ArrayList добавляются элементы, ее емкость автоматически увеличивается должным образом посредством перераспределения. Емкость может быть уменьшена посредством вызова методаTrimToSize или с помощью явного задания свойстваCapacity.

Доступ к элементам этой коллекции осуществляется с помощью целочисленного индекса. Индексы в этой коллекции начинаются с нуля.

КоллекцияArrayList принимает null т.е. пустая ссылка как допустимое значение и разрешает дублировать элементы.

Использование многомерных массивов в качестве элементов коллекции ArrayList не поддерживается.

using System;
using System.Collections;
public class SampleArrayList  {

   public static void Main()  {

      // Создает и инициализирует новый ArrayList.
      ArrayList myAL = new ArrayList();
      myAL.Add("Hello");
      myAL.Add("World");
      myAL.Add("!");

      // Выводит свойства и значения элементов ArrayList.
      Console.WriteLine( "myAL" );
      Console.WriteLine( "    Count:    {0}", myAL.Count );
      Console.WriteLine( "    Capacity: {0}", myAL.Capacity );
      Console.Write( "    Values:" );
      PrintValues( myAL );
   }

   public static void PrintValues( IEnumerable myList )  {
      foreach ( Object obj in myList )
         Console.Write( "   {0}", obj );
      Console.WriteLine();
   }
}