← Назад к вопросам
В каких случаях использовать словарь?
2.0 Middle🔥 181 комментариев
#Коллекции и структуры данных
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Когда использовать Dictionary в C#
Dictionary — это одна из самых мощных коллекций в .NET. За 10+ лет разработки я видел, как правильное использование Dictionary может сократить код в 10 раз и ускорить приложение в 100 раз.
Что такое Dictionary
Dictionary<TKey, TValue> — это хеш-таблица, которая хранит пары ключ-значение и обеспечивает быстрый поиск O(1) по ключу.
Основные операции
- Add() — O(1)
- TryGetValue() — O(1)
- Remove() — O(1)
- ContainsKey() — O(1)
Когда использовать Dictionary
1. Быстрый поиск по уникальному ключу
public class UserCache
{
private Dictionary<int, User> _cache = new();
public bool TryGetUser(int userId, out User user)
{
return _cache.TryGetValue(userId, out user);
}
}
2. Маппинг между двумя наборами данных
var idToName = new Dictionary<int, string>
{
{ 1, "Alice" },
{ 2, "Bob" },
{ 3, "Charlie" }
};
Console.WriteLine(idToName[2]); // O(1) — очень быстро
3. Подсчёт частоты элементов
public Dictionary<char, int> CountCharacters(string text)
{
var counts = new Dictionary<char, int>();
foreach (char c in text)
{
if (counts.ContainsKey(c))
counts[c]++;
else
counts[c] = 1;
}
return counts;
}
4. Кеширование результатов функции (memoization)
public class FibonacciCalculator
{
private Dictionary<int, long> _memo = new();
public long Fibonacci(int n)
{
if (n <= 1)
return n;
if (_memo.TryGetValue(n, out var cached))
return cached; // Из кеша — O(1)
long result = Fibonacci(n - 1) + Fibonacci(n - 2);
_memo[n] = result;
return result;
}
}
5. Проверка на дубликаты
// ❌ МЕДЛЕННО — O(n^2)
public bool AreAllUnique(List<string> items)
{
for (int i = 0; i < items.Count; i++)
for (int j = i + 1; j < items.Count; j++)
if (items[i] == items[j])
return false;
return true;
}
// ✅ БЫСТРО — O(n)
public bool AreAllUnique(List<string> items)
{
var seen = new HashSet<string>();
foreach (var item in items)
if (!seen.Add(item))
return false;
return true;
}
Dictionary vs другие коллекции
Dictionary vs List
var users = new List<User>();
var user = users.FirstOrDefault(u => u.Id == 123); // O(n)
var userDict = new Dictionary<int, User>();
var user = userDict[123]; // O(1) — в 1000x быстрее!
Dictionary vs HashSet
var uniqueIds = new HashSet<int>(); // Только ключи
var userCache = new Dictionary<int, User>(); // Ключ + значение
Dictionary vs SortedDictionary
var fast = new Dictionary<int, string>(); // O(1), неупорядоченный
var sorted = new SortedDictionary<int, string>(); // O(log n), отсортирован
Хорошие практики
1. Используй TryGetValue вместо ContainsKey
// ❌ Два поиска
if (dict.ContainsKey(key))
var value = dict[key];
// ✅ Один поиск
if (dict.TryGetValue(key, out var value))
Console.WriteLine(value);
2. Предварительно резервируй место
// ✅ Для 1 миллиона элементов
var dict = new Dictionary<int, string>(1_000_000);
for (int i = 0; i < 1_000_000; i++)
dict[i] = $"value_{i}";
3. Для многопоточности используй ConcurrentDictionary
var concurrentDict = new ConcurrentDictionary<string, int>();
concurrentDict.AddOrUpdate("key", 1, (k, v) => v + 1);
Выводы
- Dictionary идеален для быстрого поиска O(1)
- Используй когда нужны частые операции поиска/вставки
- Лучше чем List.FirstOrDefault() для больших коллекций
- TryGetValue эффективнее ContainsKey
- Для многопоточности используй ConcurrentDictionary