Опис Колекцій C#. Визначення, приклади використання. Аналогії
Колекції 🔗
Колекція це об’єкт, що містить набір значень і дозволяє взаємодіяти з цими значеннями (переглядати, додавати, змінювати, видаляти, сортувати …) .
Класифікація колекцій за характеристиками 🔗
- Постійні, динамічні
- Може зберігати об’єкти одного типу чи об’єкти різних типів
Класифікація колекцій з логіки організації 🔗
- Вектор - Масив
- Матриця - Двовимірний масив
- Багатомірний масив
- Список - Впорядкована колекція об’єктів
- Стек – останнім прийшов – першим вийшов LIFO
- Черга – першим прийшов – першим вийшов FIFO
- Асоціативний масив (словник) – невпорядкована колекція, що зберігає пари «ключ – значення»
- Безліч - невпорядкована колекція, що зберігає набір унікальних значень
- Мультимножина - безліч, що допускає наявність одночасно кількох однакових значень.
Класифікація колекцій з реалізації 🔗
Інтерфейси колекцій 🔗
IEnumerable<T>
: визначає метод GetEnumerator, можна отримувати елементи будь-якої колекції Реалізація інтерфейсу дозволяє перебирати елементи колекції за допомогою foreach
ICollection<T>
: представляє загальні властивості та методи для всіх узагальнених колекцій (наприклад, методи CopyTo, Add, Remove, Contains, властивість Count
)
IList<T>
: надає функціонал для створення послідовних списків
IComparer<T>
: визначає метод Compare для порівняння двох однотипних об’єктів
IDictionary<TKey, TValue>
: колекція повинна зберігати об’єкти у вигляді пар ключ-значення TKey, TValue
IEqualityComparer<T>
: визначає методи, за допомогою яких два однотипні об’єкти порівнюються на предмет рівності
реалізуються класами колекцій у просторі імен System.Collections.Generic
:
Необхідні простори імен 🔗
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
Типи колекцій C# 🔗
- Масив
ArrayList objectList =
new ArrayList()
{ 1, 2, "string", 'c', 2.0f };
- Однозв’язковий список
List<T>
: послідовний перелік. Реалізує інтерфейсиIList<T>, ICollection<T>, IEnumerable<T>
List<int> numbers =
new List<int>() { 1, 2, 3, 45 };
SortedSet<T>
: відсортована колекція однотипних об’єктів. Реалізує інтерфейси ICollection<T>, ISet<T>, IEnumerable<T>
SortedList<TKey, TValue>
: зберігає набори пар “ключ-значення”, відсортовані за ключом. Реалізує інтерфейси ICollection<T>, IEnumerable<T>, IDictionary<TKey, TValue>
- Двозв’язковий список
LinkedList<T>
: Двозв’язаний список. Реалізує інтерфейсиICollection<T> , IEnumerable<T>
LinkedList<int> numbers1 =
new LinkedList<int>();
- Стек
Stack<T>
: стек однотипних об’єктів. Реалізує інтерфейсиICollection<T> , IEnumerable<T>
Stack<int> numbers3 =
new Stack<int>();
- Хеш-таблиця
Hashtable
реалізуються інтерфейсиIDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback и ICloneable
Hashtable htbl = new Hashtable();
htbl.Add("name", "key123");
- Бітовий масив
BitArray(byte[] bytes)
And(),Get(),Not(),Or(),Set(),SetAll(),Xor()
BitVector32
CreateMask()
CreateSelection()
BitArray bits1 = new BitArray(10);
var bits2 = new BitVector32 () ;
- Черга
Queue<T>
:FIFO(“перший увійшов-перший вийшов”). Реалізує інтерфейсиICollection, IEnumerable<T>
Queue<int> numbers2 =
new Queue<int>();
- Словарь
Dictionary<TKey, TValue>
: “ключ-значення”. Реалізує інтерфейсиICollection<T>, IEnumerable<T>, IDictionary<TKey, TValue>
Dictionary<int, string> countries =
new Dictionary<int, string>(5);
SortedDictionary<TKey, TValue>
: зберігає набори пар “ключ-значення”, відсортованих за ключом. Схожий на клас SortedList<TKey, TValue>
, основні відмінності полягають лише у використанні пам’яті та швидкості вставки та видалення
- способи створення колекцій
IEnumerable<int> randomCol =
Enumerable.Range(1, 10);
foreach (var item in randomCol)
{
Console.WriteLine((item.ToString());
}
var r = new Random(Seed:5);
var rVal = r.Next(minValue:1,maxValue:10);
IEnumerable<int> squares =
Enumerable.Range(20, 30).Select(x => x * rVal);
Ітератори та оператор yield 🔗
using System.Collections;
Numbers numbers = new Numbers();
foreach (int n in numbers)
{
Console.WriteLine(n);
}
class Numbers
{
public IEnumerator GetEnumerator()
{
for(int i = 0; i < 6; i++)
{
yield return i * i;
}
}
}