Колекції (C# та Visual Basic), Microsoft Docs
Багато додатках потрібно створювати групи пов'язаних об'єктів і керувати цими групами. Існує два способи угруповання об'єктів: створити масив об'єктів та створити колекцію.
Масиви найзручніше використовувати для створення та роботи з фіксованим числом строго типізованих об'єктів. Відомості про масиви див. у розділах Масиви Visual Basic або Масиви (Посібник із програмування на C#).
Колекції забезпечують більш гнучкий спосіб роботи з групами об'єктів. На відміну від масивів, група об'єктів у класі може динамічно зростати та скорочуватися відповідно до потреб програми. При роботі з деякими колекціями можна присвоїти ключ будь-якому об'єкту, який необхідно помістити в колекцію, щоб можна було швидко отримати об'єкт за ключом.
Колекція є класом, тож перед додаванням елементів необхідно оголосити нову колекцію.
Якщо колекція містить елементи лише одного типу даних, можна використовувати один із класів у просторі імен System.Collections.Generic. Універсальна колекція забезпечує безпеку типів, тому інші типи даних не можуть бути додані до неї. При вилученні елемента з універсальної колекції немає потреби визначати чи перетворювати його тип даних.
Для прикладів у цьому розділі увімкніть оператори Imports (Visual Basic) або директиви using (C#) для просторів іменSystem.Collections.Generic таSystem.Linq.
Зміст розділу
Використання простої колекції
Клас Collection у Visual Basic
Реалізація колекції пар "ключ-значення"
Використання LINQ для доступу до колекції
Визначення користувальницької колекції
Використанняпростий колекції
У прикладах цього розділу використовується універсальний клас List, який дозволяє працювати зі типовими списками об'єктів.
У наступному прикладі створюється список рядків, а потім переглядаються рядки за допомогою оператора For Each ... Next (Visual Basic) або foreach (C #).
Якщо вміст колекції відомий заздалегідь, можна ініціалізувати колекцію для ініціалізації колекції. Щоб отримати додаткові відомості, див. Ініціалізатори колекцій (Visual Basic) або Ініціалізатори об'єктів та колекцій (Посібник із програмування в C#).
Наступний приклад аналогічний попередньому, за винятком того, що ініціалізатор колекції використовується для додавання елементів до колекції.
Для виконання ітерації колекції можна використовувати оператор For…Next (Visual Basic) або for (C#) замість оператора For Each. Це здійснюється шляхом доступу до елементів колекції за позицією індексу. Індекс елементів починається з 0 і закінчується на числі, що дорівнює кількості елементів за вирахуванням 1.
У наступному прикладі виконується перебір елементів колекції за допомогою For…Next замість For Each.
У наступному прикладі видаляється елемент із колекції шляхом вказівки об'єкта для видалення.
У цьому прикладі видаляються елементи з універсального списку. Замість оператора For Each, використовується оператор For…Next (Visual Basic) або for (C#), що проходить у порядку зменшення. Це так, тому що в результаті роботи методу RemoveAt елементи, що йдуть за віддаленим елементом, мають менше значення індексу.
Для типу елементів List можна також визначити власний клас. У наступному прикладі клас Galaxy, який використовується об'єктом List, визначено у коді.
Види колекцій
Багато типових колекційнадається платформою .NET Framework. Кожен тип колекції призначено для певної мети.
Наступні групи класів колекцій описані в цьому розділі:
КласиSystem.Collections.Generic
КласиSystem.Collections.Concurrent
КласиSystem.Collections
Клас Collection у Visual Basic
Класи System.Collections.Generic
Універсальну колекцію можна створити, використовуючи один із класів у просторі імен System.Collections.Generic. Універсальна колекція застосовується, якщо всі елементи в колекції мають однаковий тип даних. Універсальна колекція забезпечує строгу типізацію, дозволяючи додавання лише необхідних типів даних.
У наступній таблиці перелічені деякі з найчастіше використовуваних класів простору імен System.Collections.Generic:
Надає колекцію пар ключ/значення, які впорядковані за ключом.
Надає список об'єктів, доступних за індексом. Надає методи для пошуку за списком, виконання сортування та зміни списку.
Надає колекцію об'єктів, яка обслуговується за принципом "першим прийшов - першим вийшов" (FIFO).
Представляє колекцію пар ключ/значення, упорядкованих за ключем на основі реалізації IComparer.
Представляє колекцію об'єктів, яка обслуговується за принципом "останнім прийшов – першим вийшов" (LIFO).
Класи System.Collections.Concurrent
У .NET Framework 4 колекції простору імен System.Collections.Concurrent надають ефективні потокобезпечні операції для доступу до елементів колекції з кількох потоків.
Класи простору імен System.Collections.Concurrent слід використовувати замість відповідних типів просторів іменSystem.Collections.Generic та System.Collections, якщо кілька потоків паралельно звертаються до такої колекції. Для отримання додаткових відомостей див. розділ Потокобезпечні колекції та System.Collections.Concurrent.
Класи System.Collections
Класи у просторі імен System.Collections не зберігають елементи як конкретно типизированных об'єктів, а зберігають їх як об'єкти типу Object.
Скрізь, де це можливо, слід використовувати універсальні колекції простору імен System.Collections.Generic або простору імен System.Collections.Concurrent замість застарілих типів простору іменSystem.Collections.
У наступній таблиці перераховані деякі з найчастіше використовуваних класів у просторі іменSystem.Collections :
Представляє масив об'єктів, розмір якого динамічно збільшується за необхідності.
Надає колекцію пар ключ/значення, які впорядковані за хеш-кодом ключа.
Надає колекцію об'єктів, яка обслуговується за принципом "першим прийшов - першим вийшов" (FIFO).
Представляє колекцію об'єктів, яка обслуговується за принципом "останнім прийшов – першим вийшов" (LIFO).
Простір імен System.Collections.Specialized надає спеціалізовані строго типізовані класи колекцій, такі як колекції рядків, пов'язані списки та гібридні словники.
Клас Collection у Visual Basic
Можна використовувати клас Collection Visual Basic для доступу до елемента колекції за числовим індексом або ключем String. Можна додавати елементи до об'єкта колекції із зазначенням або без зазначення ключа. Якщо додати об'єкт без ключа, необхідно використовувати його числовий індекс для доступу до нього.
Клас Collection Visual Basic зберігає всі свої елементи яктип Object, тож можна додати елемент будь-якого типу даних. Немає жодного захисту від додавання невідповідних типів даних.
При використанні класу Collection Visual Basic перший елемент колекції має індекс 1. Це відрізняється від класів колекцій платформи .NET Framework, для яких початковий індекс дорівнює 0.
Скрізь, де це можливо, слід використовувати універсальні колекції в просторі імен System.Collections.Generic або в просторі імен System.Collections.Concurrent замість класу Collection Visual Basic.
Додаткові відомості див. у розділі Collection.
Реалізація колекції пар "ключ-значення"
Універсальна колекція Dictionary дозволяє отримати доступ до елементів колекції за допомогою ключа кожного елемента. Кожен елемент, що додається словник, складається зі значення та пов'язаного з ним ключа. Вилучення значення з його ключа відбувається швидко, оскільки класDictionary реалізований як хеш-таблиця.
У цьому прикладі створюється колекціяDictionary і послідовно перебирається словник з допомогою оператора For Each.
Щоб замість цього використовувати ініціалізатор колекції для збирання колекціїDictionary, можна замінити методи BuildDictionary та AddToDictionary наступним методом.
У наступному прикладі використовується метод ContainsKey та властивість ItemDictionary, щоб швидко знайти елемент за ключом. ВластивістьItem дозволяє отримати доступ до елемента в колекції elements за допомогою коду elements(symbol) у Visual Basic або elements[symbol] у C#.
У цьому прикладі замість цього використовується метод TryGetValue для швидкого пошуку елемента по ключу.
Використання LINQ для доступу до колекції
Для доступу до колекції можна використовувати мову інтегрованихзапитів (LINQ) Запит LINQ забезпечує можливості фільтрації, впорядкування та угруповання. Щоб отримати додаткові відомості, див. Початок роботи з LINQ у Visual Basic або Початок роботи з LINQ у C#.
У цьому прикладі виконується запит LINQ до універсальногоList. Запит LINQ повертає іншу колекцію, яка містить результати.
Сортування колекції
Наступний приклад показує процедуру сортування колекції. У прикладі сортуються екземпляри класу Car, які зберігаються у List. Клас Car реалізує інтерфейс IComparable, який вимагає, щоб метод CompareTo був реалізований.
Кожен виклик методу CompareTo робить одне порівняння, яке використовується для сортування. Написаний користувачем код методуCompareTo повертає значення для кожного порівняння поточного об'єкта з іншим об'єктом. Значення, що повертається менше нуля, якщо поточний об'єкт менше іншого об'єкта, більше нуля, якщо поточний об'єкт більше іншого об'єкта, а також дорівнює нулю, якщо об'єкти рівні. Це дозволяє визначити в коді умови для відношення "більше", "менше" і "рівно".
У методі ListCars оператор cars.Sort() сортує список. Цей виклик методу Sort List призводить до того, що методCompareTo викликається автоматично для об'єктів Car уList.
Визначення користувальницької колекції
Хоча можна визначити власну колекцію, зазвичай краще використовувати колекції, що входять до платформи .NET Framework, які описані в розділі Види колекцій вище в цьому розділі.
У наступному прикладі визначається колекція користувача з ім'ям AllColors. Цей клас реалізує інтерфейс IEnumerable, який вимагає, щоб метод GetEnumerator був реалізований.
МетодGetEnumerator повертає екземпляр класуColorEnumerator. ColorEnumerator реалізує інтерфейс IEnumerator, який вимагає, щоб було реалізовано властивість Current, метод MoveNext і метод Reset.
Ітератор використовується для виконання ітерацій користувача по колекції. Ітератор може бути методом чи методом доступу get. Ітератор використовує оператор Yield (Visual Basic) або yield return (C#) для повернення кожного елемента колекції за один раз.
Ітератор викликається за допомогою оператора For Each ... Next (Visual Basic) або foreach (C #). Кожна ітерація циклу For Each викликає ітератор. При досягненні оператора Yield або yield return в ітераторі повертається вираз, і поточне розташування коду зберігається. Під час наступного виклику ітератора виконання поновлюється з цього місця.
Для отримання додаткової інформації див. Ітератори (C# та Visual Basic).
У прикладі використовується метод-итератор. Метод-ітератор містить оператор Yield або yield return, що знаходиться всередині циклу For…Next (Visual Basic) або for (C#). У методі ListEvenNumbers кожна ітерація тіла оператора For Each створює виклик методу-ітератора, який переходить до наступного оператора Yield або yield return.