Dictionary<K, V> в .NET — это реализация хэш-таблицы, обеспечивающая быстрый доступ к элементам по ключу. Несмотря на кажущуюся простоту CRUD-операций (Create, Read, Update, Delete), в их реализации есть несколько важных нюансов.
var dict = new Dictionary<string, int>();
dict.Add("key1", 42); // или dict["key1"] = 42;
Сложности:
Особенности:
Add() выбрасывается ArgumentExceptiondict[key] = value) существующее значение перезаписываетсяint value = dict["key1"]; // Прямой доступ
bool exists = dict.TryGetValue("key1", out value); // Безопасный доступ
Сложности:
KeyNotFoundExceptiondict["key1"] = 100; // Простое обновление
Сложности:
dict.Remove("key1"); // Удаление по ключу
dict.Clear(); // Полная очистка
Сложности:
InvalidOperationExceptionpublic class BadKey
{
public int Id { get; set; }
public override int GetHashCode() => 1; // Ужасная реализация!
}
GetHashCode() может превратить сложность O(1) в O(n)GetHashCode() и Equals() может сломать логику словаряClear() внутренние массивы не уменьшаютсяvar dict = new Dictionary<string, int>(capacity: 1000);
if (dict.TryGetValue(key, out var value)) {...}
var concurrentDict = new ConcurrentDictionary<string, int>();
| Операция | Средний случай | Худший случай |
|---|---|---|
| Добавление | O(1) | O(n) |
| Поиск | O(1) | O(n) |
| Обновление | O(1) | O(n) |
| Удаление | O(1) | O(n) |
хотя Dictionary<K, V> предоставляет эффективные CRUD-операции в среднем случае, разработчику важно понимать внутреннюю реализацию и потенциальные проблемы, особенно связанные с хэш-кодами, коллизиями и потокобезопасностью, чтобы избежать неожиданного падения производительности.