Учебное пособие по коллекциям C# с примерами

⚡ Умное резюме

В C# коллекции предоставляют гибкий способ хранения и управления группами объектов. В отличие от массивов, коллекции увеличиваются и уменьшаются во время выполнения, а пространства имен System.Collections и System.Collections.Generic предоставляют готовые типы для списков, словарей, стеков и очередей.

  • 🔃 Динамическое изменение размера: В коллекциях добавление и удаление элементов происходит во время выполнения, поэтому вам не нужно заранее фиксировать размер, как в массивах.
  • 📚 Пространства имен: System.Collections содержит негенерические типы, а System.Collections.Generic — типобезопасные генерические типы.
  • 🧱 Основные классы: ArrayList, Stack, Queue, Hashtable, SortedList и BitArray удовлетворяют распространенным нетиповым потребностям.
  • Общая мощность: List, Dictionary, HashSet и Queue обеспечивают типобезопасность на этапе компиляции и повышают производительность.
  • 🔑 Правильный выбор: Для поиска по ключу используйте словарь, для упорядоченных элементов — список, а для порядка LIFO или FIFO — стек или очередь.
  • 🤖 Помощь ИИ: GitHub Copilot генерирует код для работы с коллекциями, а конвейеры ML.NET передают данные через универсальные типы коллекций.

Коллекции в C#

В нашем предыдущем уроке мы узнали, как использовать массивы в C#. Давайте кратко рассмотрим это. Массивы в программировании используются для группировки набора связанных объектов. Таким образом, можно создать массив или набор целых чисел, доступ к которым можно получить через одно имя переменной.

Что такое коллекции в C#?

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

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

Но в коллекции вам не нужно заранее определять размер коллекции. Вы можете добавлять элементы или даже удалять элементы из коллекции в любой момент времени. В этой главе основное внимание будет уделено тому, как мы можем работать с различными коллекциями, доступными в C#.

Классы System.Collections

В платформе .NET Framework исходные негенерические классы коллекций объединены в пространство имен System.Collections. В таблице ниже приведены основные типы, которые можно использовать сразу же.

Описание
ArrayList Коллекция ArrayList аналогична коллекции Arrays. тип данных в C#. Самым большим отличием является динамическая природа коллекции списков массивов.
Стек Стек представляет собой особый случай коллекции, отражающий концепцию "последним вошел — первым вышел" (LIFO).
Очереди Очередь представляет собой особый тип коллекции, в которой применяется принцип «первым пришел — первым обслужен».
Хеш-таблица Хэш-таблица — это особый тип коллекции, используемый для хранения элементов типа «ключ-значение».
СортированныйСписок SortedList — это коллекция, которая по умолчанию хранит пары ключ-значение в порядке возрастания ключей.
BitArray Битовый массив — это массив структуры данных, в котором хранятся биты.

Обобщенные коллекции в C#

В приведенных выше негенерических классах каждый элемент хранится как общий объект, что означает, что компилятор не может проверить тип, и программа несет небольшие затраты на упаковку значений. Для решения этой проблемы в C# было добавлено пространство имен System.Collections.Generic, где каждая коллекция привязана к одному объявленному типу.

Обобщенная коллекция, например, Список Принимает только строки, поэтому ошибки обнаруживаются на этапе компиляции, и при чтении элемента не требуется приведение типов. Это делает универсальные коллекции более безопасными, быстрыми и удобными для чтения, поэтому они являются выбором по умолчанию в современном коде C#.

Ниже перечислены наиболее распространенные общие коллекции:

  • Список : Изменяемый размер списка на основе индексов, универсальная замена ArrayList.
  • Словарь : Хранит пары ключ-значение с быстрым поиском на основе хеша.
  • Хэшсет : Содержит только уникальные значения и поддерживает операции над множествами, такие как объединение.
  • Очередь : Метод "первым пришел — первым обслужен", универсальная версия метода "очередь".
  • Куча : Метод сбора данных «последний вошел — первый вышел», универсальная версия Stack.
  • Отсортированный список : Сохраняет пары ключ-значение, отсортированные по ключу в порядке возрастания.

Пример использования коллекции списков на C#

Список (List) — наиболее широко используемая универсальная коллекция, поскольку он ведёт себя как динамический массив. В приведённом ниже примере создаётся список строк, добавляются и удаляются элементы, считывается его размер, а затем выводятся оставшиеся значения. Весь код написан в файле Program.cs.

Шаг 1) Импортируйте пространство имен System.Collections.Generic и объявите список строк.

Шаг 2) Добавляйте элементы с помощью метода Add и удаляйте их с помощью метода Remove.

Шаг 3) Прочитайте свойство Count, затем пройдитесь по списку с помощью цикла foreach.

using System;
using System.Collections.Generic;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   List<string> tutorials = new List<string>();
   tutorials.Add("Java");
   tutorials.Add("Python");
   tutorials.Add("Kotlin");
   tutorials.Remove("Python");
   Console.WriteLine(tutorials.Count);
   foreach (string tutorial in tutorials)
   {
    Console.WriteLine(tutorial);
   }
   Console.ReadKey();
  }
 }
}

Code Объяснение:-

  1. Пространство имен System.Collections.Generic импортируется, поэтому тип List доступен программе.
  2. Новый список Создается файл с названием tutorials, и с помощью метода Add добавляются три имени.
  3. Метод Remove удаляет значение «Python», в результате чего в списке остаются два пункта.
  4. Свойство Count возвращает количество элементов, а цикл foreach выводит каждое оставшееся значение по порядку.

При запуске программа сначала выводит количество 2маркетологов. На втором месте Instagram – Java и Котлин на отдельных строках. Это показывает, как коллекция изменяет свой размер во время выполнения, чего не может сделать фиксированный массив.

Разница между массивами и коллекциями в C#

Оба массив Коллекция объединяет связанные элементы под одним именем, но при этом они ведут себя по-разному после запуска программы. Знание того, когда использовать тот или иной подход, помогает писать более чистый и эффективный код.

Основные различия перечислены ниже:

  • Размер: Массив имеет фиксированную длину, устанавливаемую при объявлении, в то время как коллекция может увеличиваться или уменьшаться в любой момент.
  • Обработка типов: Массив хранит объекты одного типа, тогда как коллекция может быть типобезопасной при использовании обобщенных типов или содержать объекты смешанных типов, если она не является обобщенной.
  • Локации: Массивы встроены в язык, а классы коллекций находятся в пространствах имен System.Collections и System.Collections.Generic.
  • Встроенные операции: Коллекции предоставляют удобные методы для добавления, удаления, поиска и сортировки элементов, в то время как массивы обеспечивают только базовый индексированный доступ.
  • Лучший способ применения: Если количество элементов известно и фиксировано, выбирайте массив, а если количество элементов изменяется в процессе выполнения программы, используйте коллекцию.

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

Часто задаваемые вопросы (FAQ)

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

HashSet и Dictionary обеспечивают самый быстрый поиск, поскольку используют хеширование для достижения элемента практически за постоянное время. List или array работают медленнее, поскольку им, возможно, потребуется проверять каждый элемент последовательно.

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

IEnumerable — это базовый интерфейс, который поддерживает только чтение элементов с помощью цикла foreach. ICollection расширяет его и добавляет такие члены, как Count, Add и Remove, поэтому он также поддерживает модификацию коллекции.

List — это универсальная, типобезопасная коллекция, хранящая один объявленный тип, что обеспечивает проверку на этапе компиляции и повышает производительность. ArrayList не является универсальным классом и хранит каждый элемент как объект, что требует приведения типов и позволяет использовать смешанные типы.

Стек работает по принципу «последний вошел — первый вышел», поэтому сначала удаляется самый последний элемент с помощью операции Pop. Очередь работает по принципу «первый вошел — первый вышел», поэтому сначала удаляется самый старый элемент с помощью операции Dequeue.

Да. GitHub Copilot может предложить подходящий тип коллекции, сгенерировать циклы для добавления или фильтрации элементов, а также выполнять LINQ-запросы на основе короткого комментария, что ускоряет работу со списками, словарями и другими коллекциями.

ML.NET передает обучающие данные через коллекции, такие как List и IEnumerable, которые соответствуют конвейеру IDataView. Хранение образцов в строго типизированной универсальной коллекции обеспечивает ясность и типобезопасность рабочего процесса машинного обучения.

Подведем итог этой публикации следующим образом: