我在C#中使用字典,想要显示用户输入的键,并显示该键及其相应值(如果该键存在于字典中)。另外,继续阅读各行,直到没有更多输入为止。
using System;
using System.Collections.Generic;
using System.IO;
class Solution
{
static void Main(String[] args)
{
string number = Console.ReadLine();
int n;
Int32.TryParse(number, out n);
var phoneBook = new Dictionary<string, string>();
for(int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string phoneNumber = Console.ReadLine();
phoneBook.Add(name, phoneNumber);
}
foreach (var pair in phoneBook)
{
string name = pair.Key;
string phoneNumber = pair.Value;
}
string x = Console.ReadLine();
if(!phoneBook.ContainsKey(x))
{
Console.WriteLine("Not Found");
}
else
{
string result = phoneBook[x];
Console.Write(x);
Console.Write("=");
Console.Write(result);
}
}
}
Error message:
Unhandled Exception:
System.ArgumentNullException: Value cannot be null.
Parameter name: key
at System.Collections.Generic.Dictionary2[TKey,TValue].FindEntry (TKey key) <0x7fb28d7c9320 + 0x0023c> in <3833a6edf2074b959d3dab898627f0ac>:0
at System.Collections.Generic.Dictionary2[TKey,TValue].ContainsKey (TKey key) <0x7fb28d7c8cd0 + 0x00009> in <3833a6edf2074b959d3dab898627f0ac>:0
at Solution.Main (System.String[] args) [0x00096] in solution.cs:30
[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentNullException: Value cannot be null.
Parameter name: key
at System.Collections.Generic.Dictionary2[TKey,TValue].FindEntry (TKey key) <0x7fb28d7c9320 + 0x0023c> in <3833a6edf2074b959d3dab898627f0ac>:0
at System.Collections.Generic.Dictionary2[TKey,TValue].ContainsKey (TKey key) <0x7fb28d7c8cd0 + 0x00009> in <3833a6edf2074b959d3dab898627f0ac>:0
at Solution.Main (System.String[] args) [0x00096] in solution.cs:30
答案 0 :(得分:3)
更改行:
if(!phoneBook.ContainsKey(x))
收件人:
if(x == null || !phoneBook.ContainsKey(x))
我相信错误指向该行代码。请添加指向错误代码行的注释(以使我们更容易),并请将异常文本重新设置为代码格式(删除了反引号),以便使堆栈可读。
答案 1 :(得分:2)
简短的答案是您的对象之一是null
。很有可能其中一个变量是通过调用Console.ReadLine
来设置的。
通常认为Console.ReadLine
无法返回null
。这是错误的。如果在控制台上输入了null
,它将返回Control-Z
。
因此,您需要先检查null
,然后才能与Dictionary
进行交互(例如,调用Add
或ContainsKey
)。或者,从以下位置更改您的ReadLine
呼叫:
string x = Console.ReadLine();
收件人:
string x = Console.ReadLine() ?? string.Empty;
确保变量不能为null
。
为求最佳,请考虑使用TryGetValue
与ContainsKey
来避免以后的[]
通话。
答案 2 :(得分:0)
using System;
using System.Collections.Generic;
using System.IO;
class Solution
{
static void Main(String[] args)
{
var phoneBook = new Dictionary<string, string>();
int n = Convert.ToInt32(Console.ReadLine());
for(int i = 0; i < n; i++)
{
string[] record = Console.ReadLine().Split();
string name = record[0];
string phoneNumber = record[1];
phoneBook.Add(name, phoneNumber);
}
string x;
while((x = Console.ReadLine()) != null)
{
if(phoneBook.ContainsKey(x))
{
Console.WriteLine(x + "=" + phoneBook[x]);
}
else
{
Console.WriteLine("Not found");
}
}
}
}
这是对我有用的最终解决方案。
变化:
1.添加了while
循环条件,以避免搜索字符串为空。
2.删除了不需要的foreach
循环。
3.在for
循环中,使用字典输入来使用数组在字典的每个记录/条目中存储两个字符串。