Как в индексаторе моей реализации "словаря" получить элемент словаря без перебора? - C#

Узнай цену своей работы

Формулировка задачи:

Пытался сдать лабу преподавателю, суть которой в открытом хешировании, создал свой словарь (класс Dict (перебор через элемент head и tail)) и следовательно элемент словаря (класс DictNode (поля: key, value, next (ссылка на следующий элемент))). Вроде как всё сделал (как мне показалось), описал свой индексатор (в классе Dict), в котором проходил по элементам и искал следовательно элемент с таким ключом, т.е. делал перебор. Дак вот преподаватель мне сказал, что я должен получать данные словаря по ключу, БЕЗ перебора, то есть как-то по ссылке, что я не понял. К примеру, я передаю в метод ключ типа int, и каким образом я должен организовать мой словарь, чтобы получить без перебора значение элемента по этому ключу. Надеюсь я не запутал, искал всякое в инете и увидел, то что я прикреплю на скрине. Там оборачивается массив под якобы "своей" коллекцией и просто обращается по индексу к этому внутреннему стандартному массиву. Как по мне, это не совсем своя реализация, меня интересует как именно мне организовать свою коллекцию, чтобы я мог делать, то что я описал выше, если такое возможно. Просветите дурака пожалуйста, спасибо.

Решение задачи: «Как в индексаторе моей реализации "словаря" получить элемент словаря без перебора?»

textual
Листинг программы
  1.   public class Dict<TK, TV>
  2.   {
  3.     private class Entry
  4.     {
  5.       public readonly TK Key;
  6.       public TV Value;
  7.  
  8.       public Entry Next;
  9.  
  10.       public Entry(TK key, TV value)
  11.       {
  12.         Key = key;
  13.         Value = value;
  14.       }
  15.     }
  16.  
  17.     private int _count;
  18.     private Entry[] _entries;
  19.  
  20.     public Dict()
  21.     {
  22.       _entries = new Entry[100];
  23.     }
  24.  
  25.     public void Add(TK key, TV value)
  26.     {
  27.       var index = Math.Abs(key.GetHashCode()) % _entries.Length;
  28.       var entry = _entries[index];
  29.       if (entry == null)
  30.       {
  31.         _entries[index] = new Entry(key, value);
  32.       }
  33.       else
  34.       {
  35.         var e = entry;
  36.         while (true)
  37.         {
  38.           if (e.Key.Equals(key))
  39.             throw new ArgumentException("key already added");
  40.           if (e.Next == null)
  41.             break;
  42.           e = e.Next;
  43.         }
  44.         e.Next = new Entry(key, value);
  45.       }
  46.       _count++;
  47.     }
  48.  
  49.     public TV this[TK key]
  50.     {
  51.       get
  52.       {
  53.         var index = Math.Abs(key.GetHashCode()) % _entries.Length;
  54.         var entry = _entries[index];
  55.         if (entry == null)
  56.           throw new KeyNotFoundException();
  57.  
  58.         var e = entry;
  59.         while (true)
  60.         {
  61.           if (e.Key.Equals(key))
  62.             return e.Value;
  63.  
  64.           if (e.Next == null)
  65.             throw new KeyNotFoundException();
  66.           e = e.Next;
  67.         }
  68.       }
  69.     }
  70.   }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.273 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы