Где лучше использовать List, а где Dictionary?

«Где лучше использовать List, а где Dictionary?» — вопрос из категории Алгоритмы и структуры данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор между List<T> и Dictionary<TKey, TValue> зависит от операций, которые будут выполняться с коллекцией чаще всего.

Используйте List<T>, когда:

  • Важен порядок элементов. Список сохраняет последовательность вставки.
  • Требуется частый доступ по индексу (например, list[5]). Это операция O(1).
  • Выполняются частые итерации по всем элементам.
  • Основные операции — добавление/удаление в конце коллекции (Add, RemoveAt(list.Count-1)).
  • Вставка или удаление в середину списка — дорогая операция O(n), так как требует сдвига элементов.
// Оптимальный сценарий для List: последовательная обработка
List<string> logEntries = new List<string>();
logEntries.Add("Application started"); // Быстрое добавление в конец
logEntries.Add("User logged in");

foreach (var entry in logEntries) { /* Быстрая итерация */ }
string firstEntry = logEntries[0]; // Мгновенный доступ по индексу

Используйте Dictionary<TKey, TValue>, когда:

  • Критически важен быстрый поиск значения по уникальному ключу. Это операция O(1) в среднем.
  • Данные имеют ассоциативную природу (ключ → значение), например, кэш, справочники.
  • Порядок элементов не важен (или используйте OrderedDictionary, SortedDictionary).
  • Ключи должны быть уникальными. Попытка добавить дубликат вызовет исключение.
// Оптимальный сценарий для Dictionary: быстрый поиск по идентификатору
Dictionary<int, Customer> customerCache = new Dictionary<int, Customer>();
customerCache.Add(101, new Customer { Id = 101, Name = "Alice" });

// Мгновенное получение клиента по ID, даже в огромной коллекции
if (customerCache.TryGetValue(101, out Customer foundCustomer))
{
    Console.WriteLine(foundCustomer.Name);
}

Итог: List — для упорядоченных последовательностей, Dictionary — для ассоциативных массивов с быстрым поиском по ключу.