Ejemplo n.º 1
0
            // Метод удаления по ключу.
            public void Delete(TK key)
            {
                // Создаем экземпляр класса валидации.
                var validate = new ValidateClass <TK, TV>();

                // Проверяем наличие ключа.
                validate.ValidateKey(key);

                // Проверяем размер ключа.
                validate.ValidateKeySize(key);

                var hash = GetHash(key);

                if (!_hashMapItems.ContainsKey(hash))
                {
                    throw new KeyNotFoundException($"There is no such key: {nameof(key)}");
                }

                var oldHashTableItem = _hashMapItems[hash];

                var item = oldHashTableItem.SingleOrDefault(obj => EqualityComparer <TK> .Default.Equals(obj.Key, key));

                // Если элемент найден - удаляем.
                if (item != null)
                {
                    oldHashTableItem.Remove(item);
                }
            }
Ejemplo n.º 2
0
            public TV Search(TK key)
            {
                // Создаем экземпляр класса валидации.
                var validate = new ValidateClass <TK, TV>();

                validate.ValidateKey(key);

                validate.ValidateKeySize(key);

                var hash = GetHash(key);

                if (!_hashMapItems.ContainsKey(hash))
                {
                    throw new KeyNotFoundException($"There is no such key: {nameof(key)}");
                }

                var oldHashTableItem = _hashMapItems[hash];

                if (oldHashTableItem != null)
                {
                    var item = oldHashTableItem.SingleOrDefault(obj =>
                                                                EqualityComparer <TK> .Default.Equals(obj.Key, key));

                    if (item != null)
                    {
                        return(item.Value);
                    }
                }

                // Возвращаем пустое значение.
                return(default(TV));
            }
Ejemplo n.º 3
0
            public int GetHash(TK key)
            {
                // Создаем экземпляр класса валидации.
                var validate = new ValidateClass <TK, TV>();

                validate.ValidateKey(key);

                validate.ValidateKeySize(key);

                return(key.ToString().Length);
            }
Ejemplo n.º 4
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);
                }
            }