Описание: Фиксированная коллекция элементов одного типа. Самый базовый тип коллекции в .NET.
// Создание и инициализация
int[] numbers = new int[3] { 1, 2, 3 };
string[] names = { "Alice", "Bob", "Charlie" };
// Доступ по индексу
numbers[0] = 10; // O(1)
int first = numbers[0]; // O(1)
Сложность операций:
Использование: Когда известен фиксированный размер коллекции и нужна максимальная производительность.
Описание: Динамический массив, который автоматически увеличивает capacity при необходимости.
List<int> numbers = new List<int> { 1, 2, 3 };
// Добавление элементов
numbers.Add(4); // O(1) (амортизированная)
numbers.Insert(0, 0); // O(n)
// Поиск
bool contains = numbers.Contains(2); // O(n)
int index = numbers.IndexOf(2); // O(n)
Сложность операций:
Использование: Когда нужен динамический массив с частым доступом по индексу, но редкими вставками/удалениями в середине.
Описание: Коллекция уникальных элементов, основанная на хэш-таблицах.
HashSet<string> names = new HashSet<string> { "Alice", "Bob" };
// Добавление (возвращает false если элемент уже есть)
bool added = names.Add("Charlie"); // O(1)
// Проверка наличия
bool exists = names.Contains("Alice"); // O(1)
// Удаление
names.Remove("Bob"); // O(1)
Сложность операций:
Использование: Для хранения уникальных элементов, когда важна быстрая проверка принадлежности.
Описание: Коллекция пар ключ-значение, основанная на хэш-таблицах.
Dictionary<string, int> ages = new Dictionary<string, int>
{
["Alice"] = 25,
["Bob"] = 30
};
// Добавление/обновление
ages["Charlie"] = 28; // O(1)
// Получение значения
int aliceAge = ages["Alice"]; // O(1)
// Проверка ключа
bool hasKey = ages.ContainsKey("Bob"); // O(1)
// Удаление
ages.Remove("Alice"); // O(1)
Сложность операций:
Использование: Для ассоциативных массивов, когда нужен быстрый доступ по ключу.
Операция | Array | List<T> | HashSet<T> | Dictionary<K,V> |
---|---|---|---|---|
Доступ по индексу | O(1) | O(1) | - | - |
Поиск элемента | O(n) | O(n) | O(1) | O(1) по ключу |
Вставка | - | O(1)* / O(n) | O(1) | O(1) |
Удаление | - | O(n) | O(1) | O(1) |
*O(1) - амортизированная сложность для добавления в конец List
Выбор структуры данных зависит от операций, которые вы планируете выполнять чаще всего. Массивы обеспечивают лучшую производительность для фиксированных данных, List