Ejemplo n.º 1
0
            // Создание нового значения.
            public HashMapItem(TK key, TV value)
            {
                var validateClass = new ValidateClass <TK, TV>();

                validateClass.ValidateEntryParams(key, value);

                Key   = key;
                Value = value;
            }
Ejemplo n.º 2
0
            // Метод добавления новых значений в хеш-таблицу.
            // Элементы с уникальным хешем(длиной строки) добавляем новым элементом в общий словарь.
            // Элементы с уникальным ключом, но не уникальным хешем добавляем в существующий элемент словаря.
            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);
                }
            }