Dictionary<K, V> в .NET — это реализация хэш-таблицы, обеспечивающая быстрый доступ к элементам по ключу. Несмотря на кажущуюся простоту CRUD-операций (Create, Read, Update, Delete), в их реализации есть несколько важных нюансов.
var dict = new Dictionary<string, int>();
dict.Add("key1", 42); // или dict["key1"] = 42;
Сложности:
Особенности:
Add()
выбрасывается ArgumentException
dict[key] = value
) существующее значение перезаписываетсяint value = dict["key1"]; // Прямой доступ
bool exists = dict.TryGetValue("key1", out value); // Безопасный доступ
Сложности:
KeyNotFoundException
dict["key1"] = 100; // Простое обновление
Сложности:
dict.Remove("key1"); // Удаление по ключу
dict.Clear(); // Полная очистка
Сложности:
InvalidOperationException
public 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-операции в среднем случае, разработчику важно понимать внутреннюю реализацию и потенциальные проблемы, особенно связанные с хэш-кодами, коллизиями и потокобезопасностью, чтобы избежать неожиданного падения производительности.