Исключение необработанного словаря в C #: «Указанный ключ отсутствует в словаре» - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь распечатать словарь в C #, который будет имитировать график.Мой словарь выглядит так:

Dictionary<int, List<int>> graph = new Dictionary<int, List<int>>();

В основном я добавляю что-то в словарь, затем пытаюсь распечатать его:

        dicOfLists myDic = new dicOfLists();

        myDic.AddEdge(1, 2);
        myDic.printList();

Методы AddEdge и PrintList довольно просты:

AddEdge:

    public void AddEdge(int v1, int v2)
    {
        if (graph[v1] == null)
        {
            graph[v1] = new List<int> { v2 };
            return;
        }
        graph[v1].Add(v2);
    }

PrintList:

        for (int i = 0; i < 1; i++)
        {
            Console.WriteLine(graph[i][i]);
        }

Я не много программировал на C # или Python,поэтому словари являются новыми для меня.Я думаю, почему меня сбивают с толку, это более концептуально, чем что-либо еще, особенно потому, что я не уверен, как работает список в словаре.

В настоящее время я понимаю, что это так:

При вызове Addedge(1, 2) мой словарь создает список с одним элементом 2 в позиции 1 моего словаря.Это потому, что первый параметр представляет ключ словаря, а второй представляет список.Ключевые функции работают как в хеш-таблице.Когда ключ предоставлен, словарь просматривает эту позицию, а затем создает список.

Как я уже сказал, я новичок в C #, поэтому, пожалуйста, не надо слишком сильно вертеть меня.Хотя это может быть что-то тривиальное, как прямая синтаксическая ошибка, я не могу найти много чего-нибудь для этой конкретной проблемы в Интернете.Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 11 марта 2019

У вас есть один метод добавления ключа / значений в словарь, а другой - их печать.Метод, печатающий их, не «знает», что было вставлено, поэтому лучше, если этот метод не делает никаких предположений о том, что находится в словаре.Вместо того, чтобы просто циклически проходить по последовательности возможных клавиш (от 0 до 1, от 0 до n и т. Д.), Лучше работать в соответствии с тем, что на самом деле находится в словаре.

var keys = graph.Keys;

// or, if you they were entered out of sequence and you want to sort them
var keys = graph.Keys.OrderBy(k => k);

// Now you're using the actual keys that are in the dictionary, so you'll never
// try to access a missing key.

foreach(var key in keys)
{
    // It's not quite as clear to me what you're doing with these objects.
    // Suppose you wanted to print out everything:

    Console.WriteLine($"Key: {key}");

    foreach(var value in graph[key])
    {
        Console.WriteLine(value);
    }        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...