【问题标题】:Dictionary Unhandled Exception in C#: "The given key was not present in the dictionary"C# 中的字典未处理异常:“字典中不存在给定的键”
【发布时间】:2019-03-10 23:28:25
【问题描述】:

我正在尝试用 C# 打印出一个模拟图形的字典。我的字典是这样的:

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

在 main 中,我在字典中添加了一些内容,然后尝试将其打印出来:

        dicOfLists myDic = new dicOfLists();

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

AddEdgePrintList 方法非常简单:

添加边缘:

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

打印列表:

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

我没有用 C# 或 Python 做过很多编程,所以字典对我来说是新的。我认为我被绊倒的原因比任何事情都更具概念性,特别是因为我不确定字典中的列表是如何工作的。

我目前的理解方式如下:

在调用Addedge(1, 2) 时,我的字典会在我的字典的1 位置创建一个包含单个元素2 的列表。这是因为第一个参数表示字典的键,第二个参数表示列表。关键功能就像它在哈希表中一样。提供键后,字典会查看该位置,然后创建一个列表。

就像我说的,我是 C# 的新手,所以请不要太用力地歪曲我。虽然这可能像一个简单的语法错误一样微不足道,但我无法在网上找到很多关于这个特定问题的任何东西。任何帮助将不胜感激!

【问题讨论】:

  • 尝试用if (!graph.ContainsKey(v1))替换if (graph[v1] == null)
  • @Kevin Gosse 我的错误因此而略有变化。我现在得到“字典中不存在给定键'0'。”在我得到“”字典中不存在给定键“1”之前。”
  • 您的 PrintList 正在尝试使用键 0 访问元素 - 但正如错误所示,您从未添加过(您只使用键 1 添加了一个)
  • @UnholySheep 我明白你在说什么,但如果我将电话改为myDic.AddEdge(0, 1);,我仍然会收到同样的错误。我错过了你说的话吗?
  • 什么是 dicOfLists?

标签: c# list dictionary exception


【解决方案1】:

您有一种方法将键/值添加到字典中,另一种方法打印它们。打印它们的方法不“知道”插入了什么,所以如果该方法不对字典中的内容做出任何假设会更好。与其只是循环遍历一系列可能的键(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);
    }        
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多