Підручник із колекцій C# із прикладами

⚡ Розумний підсумок

Колекції в C# забезпечують гнучкий спосіб зберігання та керування групами об'єктів. На відміну від масивів, колекції збільшуються та зменшуються під час виконання, а простори імен System.Collections та System.Collections.Generic надають готові типи для списків, словників, стеків та черг.

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

Колекції в C#

У нашому попередньому посібнику ми дізналися про те, як ми можемо використовувати масиви в C#. Давайте зробимо короткий огляд. Масиви в програмуванні використовуються для групування набору пов’язаних об’єктів. Отже, можна створити масив або набір цілих чисел, доступ до яких можна отримати за допомогою однієї назви змінної.

Що таке колекції в C#?

Колекції схожі на Масиви, це забезпечує більш гнучкий спосіб роботи з групою об’єктів.

Ви могли помітити, що в масивах потрібно заздалегідь визначити кількість елементів у масиві. Це потрібно було зробити під час оголошення масиву.

Але в колекції вам не потрібно заздалегідь визначати розмір колекції. Ви можете додавати елементи або навіть видаляти елементи з колекції в будь-який момент часу. Цей розділ зосередиться на тому, як ми можемо працювати з різними колекціями, доступними в C#.

Класи System.Collections

.NET Framework групує оригінальні неузагальнені класи колекцій у просторі імен System.Collections. У таблиці нижче наведено основні типи, які можна використовувати одразу.

COLLECTION Опис
ArrayList Колекція ArrayList подібна до Arrays тип даних у C#. Найбільшою відмінністю є динамічна природа колекції списків масивів.
Стек Стек — це спеціальна колекція випадків, яка представляє концепцію «останнім прийшов — першим вийшов» (LIFO).
черги Черга — це спеціальна колекція випадків, яка представляє концепцію «перший прийшов, перший вийшов».
Хеш -таблиця Хеш-таблиця — це спеціальна колекція, яка використовується для зберігання елементів типу «ключ-значення».
Відсортований список SortedList — це колекція, яка за умовчанням зберігає пари ключ-значення в порядку зростання ключа.
BitArray Масив бітів — це масив структури даних, який зберігає біти.

Універсальні колекції в C#

Негенеричні класи, наведені вище, зберігають кожен елемент як загальний об'єкт, що означає, що компілятор не може перевірити тип, і програма платить невелику ціну за упаковку значень. Щоб вирішити цю проблему, C# додав простір імен System.Collections.Generic, де кожна колекція пов'язана з одним оголошеним типом.

Загальна колекція, така як List приймає лише рядки, тому помилки виявляються під час компіляції, і при зворотному зчитуванні елемента не потрібне перетворення типів. Це робить узагальнені колекції безпечнішими, швидшими та легшими для читання, тому вони є вибором за замовчуванням у сучасному коді C#.

Найпоширеніші універсальні колекції перелічені нижче:

  • Список : Список на основі індексів, що може змінюватися за розміром, універсальна заміна ArrayList.
  • Словник : Зберігає пари ключ-значення за допомогою швидкого пошуку на основі хешування.
  • Хеш-набір : Зберігає лише унікальні значення та підтримує операції з множинами, такі як об'єднання.
  • Черга : Колекція «перший прийшов, перший вийшов», узагальнена версія Queue.
  • Стек : Колекція «останнім прийшов, першим пішов», універсальна версія Stack.
  • Відсортований список : Зберігає пари ключ-значення, відсортовані за ключем у порядку зростання.

Приклад колекції списків на C#

Список є найпоширенішою узагальненою колекцією, оскільки вона поводиться як динамічний масив. У наведеному нижче прикладі створюється список рядків, додаються та видаляються елементи, зчитується його розмір, а потім виводяться значення, що залишилися. Весь код написано у файлі Program.cs.

Крок 1) Імпортуйте простір імен System.Collections.Generic та оголосіть список рядків (List).

Крок 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, А потім Java та Котлін на окремих рядках. Це показує, як колекція змінює свій розмір під час виконання, чого не може зробити фіксований масив.

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

Обидва ан масив а колекція об'єднує пов'язані елементи під одним ім'ям, проте вони поводяться по-різному під час запуску програми. Знання того, коли використовувати кожен з них, допомагає вам писати чистіший та ефективніший код.

Основні відмінності перелічені нижче:

  • Розмір: Масив має фіксовану довжину, встановлену під час оголошення, тоді як колекція може збільшуватися або зменшуватися в будь-який час.
  • Обробка типів: Масив зберігає один тип, тоді як колекція може бути типобезпечною з узагальненими типами або зберігати об'єкти змішаних типів, якщо вони не є узагальненими.
  • Місцезнаходження: Масиви вбудовані в мову, тоді як класи колекцій знаходяться в просторах імен System.Collections та System.Collections.Generic.
  • Вбудовані операції: Колекції пропонують готові методи для додавання, видалення, пошуку та сортування елементів, тоді як масиви забезпечують лише базовий індексований доступ.
  • Найкраще використання: Виберіть масив, якщо кількість елементів відома та фіксована, та колекцію, якщо кількість змінюється під час виконання програми.

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

Поширені запитання

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

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

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

IEnumerable – це базовий інтерфейс, який підтримує читання елементів лише за допомогою циклу foreach. ICollection розширює його та додає такі члени, як Count, Add та Remove, тому він також підтримує модифікацію колекції.

List — це узагальнена, типобезпечна колекція, яка зберігає один оголошений тип, що забезпечує перевірки під час компіляції та кращу продуктивність. ArrayList не є узагальненою та зберігає кожен елемент як об'єкт, який потребує приведення типів та дозволяє використовувати змішані типи.

Стек працює в порядку «останній прийшов — перший вийшов», тому найновіший елемент видаляється першим за допомогою функції «Виштовхнути». Черга працює в порядку «перший прийшов — перший вийшов», тому найстаріший елемент видаляється першим за допомогою функції «Видалити з черги».

Так. GitHub Copilot може пропонувати правильний тип колекції, генерувати цикли, які додають або фільтрують елементи, та виконувати LINQ-запити з короткого коментаря, що пришвидшує роботу зі списками, словниками та іншими колекціями.

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

Підсумуйте цей пост за допомогою: