Как в индексаторе моей реализации "словаря" получить элемент словаря без перебора? - 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; } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д