Key-Value структуры — это фундаментальная организация данных, где каждый элемент состоит из пары "ключ-значение". Рассмотрим их подробно:
Add(key, value)
- добавление элементаGet(key)
- получение значения по ключуContainsKey(key)
- проверка наличия ключаRemove(key)
- удаление элементаСамая популярная реализация хеш-таблицы в .NET:
var capitals = new Dictionary<string, string>
{
["Россия"] = "Москва",
["Франция"] = "Париж"
};
// Добавление
capitals.Add("Япония", "Токио");
// Доступ
string capital = capitals["Россия"]; // "Москва"
Особенности:
Вариант с сортировкой по ключам:
var sortedScores = new SortedDictionary<int, string>
{
[95] = "Алексей",
[80] = "Мария"
};
// Элементы автоматически сортируются по ключу
Особенности:
Потокобезопасная версия:
var concurrentDict = new ConcurrentDictionary<int, string>();
concurrentDict.TryAdd(1, "Value1");
Hashtable oldStyle = new Hashtable();
oldStyle.Add("key1", "value1"); // Упаковка при использовании примитивов
private static Dictionary<int, Product> _cache = new Dictionary<int, Product>();
public Product GetProduct(int id)
{
if (!_cache.TryGetValue(id, out var product))
{
product = LoadFromDatabase(id);
_cache.Add(id, product);
}
return product;
}
var appSettings = new Dictionary<string, string>
{
["Timeout"] = "1000",
["ServerUrl"] = "https://api.example.com"
};
string[] words = GetWords();
var frequency = new Dictionary<string, int>();
foreach (var word in words)
{
frequency[word] = frequency.TryGetValue(word, out var count) ? count + 1 : 1;
}
Структура | Вставка | Поиск | Удаление |
---|---|---|---|
Dictionary | O(1) | O(1) | O(1) |
SortedDictionary | O(log n) | O(log n) | O(log n) |
Hashtable | O(1) | O(1) | O(1) |
Качество хеш-функции:
Размер коллекции:
// Оптимизация: задание начальной емкости
var largeDict = new Dictionary<int, string>(capacity: 10000);
Для сложных ключей нужно правильно реализовать GetHashCode и Equals:
public struct CompositeKey : IEquatable<CompositeKey>
{
public int Id { get; set; }
public string Category { get; set; }
public override int GetHashCode() =>
HashCode.Combine(Id, Category);
public bool Equals(CompositeKey other) =>
Id == other.Id && Category == other.Category;
}
var compositeDict = new Dictionary<CompositeKey, string>();
Можно задать кастомный IEqualityComparer:
var caseInsensitiveDict = new Dictionary<string, int>(
StringComparer.OrdinalIgnoreCase);
Key-Value структуры — это мощный инструмент в арсенале .NET разработчика, предоставляющий эффективные способы организации данных по принципу "ключ-значение". Выбор конкретной реализации (Dictionary, SortedDictionary, ConcurrentDictionary) зависит от требований к производительности, порядку элементов и потокобезопасности. Правильное использование этих структур значительно упрощает решение множества задач — от кэширования до сложных группировок данных.