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