字典 + 元组 - 未设置对象引用 [重复]

Dictionary + Tuple - object reference was not set [duplicate]

提问人:Kalababu 提问时间:2/8/2023 最后编辑:Alexei LevenkovKalababu 更新时间:2/8/2023 访问量:63

问:

我的配置中有一些带有 x y 坐标的字母。 我想将键 + x + y 添加到我的字典中,但我没有让它起作用......

配置示例:

c|1807|833

法典:

        private Dictionary<char, Tuple<int, int>> keyCoords;
...
     string[] lines = File.ReadAllLines(filePath);
                foreach (string line in lines)
                {
                    string[] parts = line.Split('|');
                    if (parts.Length != 3)
                    {
                        continue;
                    }

                    char key = parts[0][0];
                    int x = int.Parse(parts[1]);
                    int y = int.Parse(parts[2]);
                    keyCoords[key] = Tuple.Create(x, y);
                }

最后一行给了我一个错误:keyCoords[key] = Tuple.Create(x, y);

对象引用未设置为对象实例。

C# NullReferenceException

评论

5赞 Sane 2/8/2023
你别忘了创建keyCoords吗?keyCoords = new Dictionary<char, Tuple<int, int>>()
0赞 Joel Coehoorn 2/8/2023
还需要防止空字符串parts[0]
0赞 Joel Coehoorn 2/8/2023
最后,我们可以把它归结为一句话。
0赞 Alexei Levenkov 2/8/2023
虽然@JoelCoehoorn提供了满足您需求的代码,但默认说明了为什么获得 NRE 的实际答案是什么 NRE 以及如何修复它,特别是在“集合/列表/字典”部分(也是整个主要答案值得至少阅读一次)

答:

0赞 Joel Coehoorn 2/8/2023 #1

我们可以把它归结为一句话:

private Dictionary<char, (int, int)> keyCoords;
...

keyCoords = File.ReadLines(filePath).
               Select(line => line.Split('|')).
               Where(p => p.Length == 3).
               ToDictionary(k => k[0][0], v => (int.Parse(v[1]), int.Parse(v[2])));

这通过确保我们在创建对象之前从不引用变量的任何成员来解决问题中的问题。keyCoords

请注意,与原始数据有细微的区别,因为这将替换 中的任何内容,其中原始数据可以附加数据。但是,如果这是一种可能的情况,我们首先就不会有 null referece 异常。keyCoords

评论

2赞 Flydog57 2/8/2023
哇,我从来没有见过有人在上一行上一个流利的位后面留下,就像句子中的句号(或 COBOL 程序)一样,然后用大写字母开始下一行。它以英语的方式很吸引人,但仍然令人不安。
0赞 Alexei Levenkov 2/8/2023
请注意,虽然有用且紧凑,但如果这很重要,此代码将抛出重复的键(与问题中的键不同)。考虑 ToLookup (stackoverflow.com/questions/5659066/...) 或单独防止重复(有很多问题显示了各种方法)。
0赞 Joel Coehoorn 2/8/2023
@Flydog57 它还来自于还需要不时地在 VB.Net 工作。由于 VB.Net 没有行终止符,因此它需要以二进制运算符(如 )结束该行,因此编译器可以知道该语句在没有特殊字符的情况下继续在下一行。我知道这对于 C# 来说并不完全是惯用的,但经常来回走动,这种模式就会进入你的流程。例如,在 VB 中工作时,我也倾向于使用 C# 的字符串连接,而不是原生的 .._+&