// Создание нового значения. public HashMapItem(TK key, TV value) { var validateClass = new ValidateClass <TK, TV>(); validateClass.ValidateEntryParams(key, value); Key = key; Value = value; }
// Метод добавления новых значений в хеш-таблицу. // Элементы с уникальным хешем(длиной строки) добавляем новым элементом в общий словарь. // Элементы с уникальным ключом, но не уникальным хешем добавляем в существующий элемент словаря. public void Insert(TK key, TV value) { // Создаем экземпляр класса валидации. var validate = new ValidateClass <TK, TV>(); validate.ValidateEntryParams(key, value); // Проверяем длину ключа. validate.ValidateKeySize(key); // Создаём новый элемент. var newHashMapItem = new HashMapItem <TK, TV>(key, value); // Создаём новых хеш ключа. var newHashMapItemHash = GetHash(key); List <HashMapItem <TK, TV> > newHashMapItemList = new List <HashMapItem <TK, TV> >(); if (_hashMapItems.ContainsKey(newHashMapItemHash)) { // Находим старый элемент с существующим хешем. newHashMapItemList = _hashMapItems[newHashMapItemHash]?.ToList(); // Пытаемся найти старый элемент с существующим ключом. var oldItemWithTheSameKey = newHashMapItemList.SingleOrDefault(obj => EqualityComparer <TK> .Default.Equals(obj.Key, key)); // Если такой ключ уже существует, то выбрасываем ошибку и не добавляем значение. if (oldItemWithTheSameKey != null) { throw new ArgumentException( $"Хеш-таблица уже содержит элемент с ключом {key}. Ключ должен быть уникален.", nameof(key)); } // Добавляем в существующий элемент словаря новое значение с уникальным ключом. _hashMapItems[newHashMapItemHash].Add(newHashMapItem); } else { // Создаем новый элемент словаря с уникальным ключом. newHashMapItemList = new List <HashMapItem <TK, TV> > { newHashMapItem }; _hashMapItems.Add(newHashMapItemHash, newHashMapItemList); } }