Как в индексаторе моей реализации "словаря" получить элемент словаря без перебора? - C#
Формулировка задачи:
Пытался сдать лабу преподавателю, суть которой в открытом хешировании, создал свой словарь (класс Dict (перебор через элемент head и tail)) и следовательно элемент словаря (класс DictNode (поля: key, value, next (ссылка на следующий элемент))). Вроде как всё сделал (как мне показалось), описал свой индексатор (в классе Dict), в котором проходил по элементам и искал следовательно элемент с таким ключом, т.е. делал перебор.
Дак вот преподаватель мне сказал, что я должен получать данные словаря по ключу, БЕЗ перебора, то есть как-то по ссылке, что я не понял. К примеру, я передаю в метод ключ типа int, и каким образом я должен организовать мой словарь, чтобы получить без перебора значение элемента по этому ключу.
Надеюсь я не запутал, искал всякое в инете и увидел, то что я прикреплю на скрине. Там оборачивается массив под якобы "своей" коллекцией и просто обращается по индексу к этому внутреннему стандартному массиву. Как по мне, это не совсем своя реализация, меня интересует как именно мне организовать свою коллекцию, чтобы я мог делать, то что я описал выше, если такое возможно.
Просветите дурака пожалуйста, спасибо.
Решение задачи: «Как в индексаторе моей реализации "словаря" получить элемент словаря без перебора?»
textual
Листинг программы
- public class Dict<TK, TV>
- {
- private class Entry
- {
- public readonly TK Key;
- public TV Value;
- public Entry Next;
- public Entry(TK key, TV value)
- {
- Key = key;
- Value = value;
- }
- }
- private int _count;
- private Entry[] _entries;
- public Dict()
- {
- _entries = new Entry[100];
- }
- public void Add(TK key, TV value)
- {
- var index = Math.Abs(key.GetHashCode()) % _entries.Length;
- var entry = _entries[index];
- if (entry == null)
- {
- _entries[index] = new Entry(key, value);
- }
- else
- {
- var e = entry;
- while (true)
- {
- if (e.Key.Equals(key))
- throw new ArgumentException("key already added");
- if (e.Next == null)
- break;
- e = e.Next;
- }
- e.Next = new Entry(key, value);
- }
- _count++;
- }
- public TV this[TK key]
- {
- get
- {
- var index = Math.Abs(key.GetHashCode()) % _entries.Length;
- var entry = _entries[index];
- if (entry == null)
- throw new KeyNotFoundException();
- var e = entry;
- while (true)
- {
- if (e.Key.Equals(key))
- return e.Value;
- if (e.Next == null)
- throw new KeyNotFoundException();
- e = e.Next;
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д