Реализовать словарь в c# - PullRequest
0 голосов
/ 25 апреля 2020

Меня попросили в интервью реализовать словарь. Как его реализовать? Я пытался реализовать его, используя индекс в качестве ключа, используя массив. Но не удалось реализовать словарь generi c.

1 Ответ

2 голосов
/ 25 апреля 2020

Существует много способов реализации класса, например Dictionary<T1, T2>.
. Я опишу простой.

  1. Создайте класс и список, в котором будет храниться все содержимое.
    [ Редактировать] Мы будем сравнивать значения переменных T1, поэтому требуется ограничение where T1 : IEquatable<T1>.
class MyDictionary<T1, T2> where T1 : IEquatable<T1>
{
    private List<(T1 key, T2 val)> m_internal_data;
}
Реализация функции, которая находит значение внутри класса.
[Редактировать] Использовать функцию Equals. Использование == вызывает ошибку.
public T2 Find(T1 key)
{
    // Looking for a content.
    foreach (var content in m_internal_data)
    {
        if (content.key.Equals(key))
        {
            return content.val;
        }
    }
    // It reaches here when there is no content which has the same key.
    // Then, I recommend to throw an exception or return a default value of T2.
    return default(T2);
}
Реализация функции, которая присваивает значение.
[Редактировать] Используйте Equals тоже.
public void Store(T1 key, T2 val)
{
    // Looking for a content. If exists, store a new value.
    for (int i = 0; i < m_internal_data.Count; i++)
    {
        if (m_internal_data[i].key.Equals(key))
        {
            var content = m_internal_data[i];
            content.val = val;
            m_internal_data[i] = content;
            return;
        }
    }
    // Create a new key.
    m_internal_data.Add((key, val));
}
Обеспечить возможность доступа к значению с помощью квадратных скобок. Просто вызовите предыдущие функции.
public T2 this[T1 key]
{
    get => Find(key);
    set
    {
        Store(key, value);
    }
}

Вот и все.

Конечно, это не очень оптимизировано и имеет мало полезных функций. Если вы хотите узнать, как писать словарь более полезным, я рекомендую вам прочитать GitHub dotnet / runtime Dictionary.cs , который входит в состав NET Core.

...