给定的密​​钥不在字典中。 C#

时间:2017-06-24 10:25:19

标签: c# dictionary exception

我想使用DictionaryAction来调用一些静态方法
这是我的代码:

public class  Works
{

    public static void DoWorkA()
    {
        Thread.Sleep(1000);
        Console.WriteLine("Doing Work A");
    }
    public static void DoWorkB()
    {
        Thread.Sleep(2000);
        Console.WriteLine("Doing Work B");
    }
    public static void DoWorkC()
    {
        Thread.Sleep(3000);
        Console.WriteLine("Doing Work C");
    }
}  

这是我的主要方法

 try
        {
            var DoJob = new Dictionary<int, Action>();
            DoJob.Add(1, () => Works.DoWorkA());
            DoJob.Add(2, () => Works.DoWorkB());
            DoJob.Add(3, () => Works.DoWorkC());

            var input = Console.Read();
            var job = DoJob[input];
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);

        }
        Console.ReadKey();  

我使用foreach来迭代密钥并且密钥存在

 foreach (var item in DoJob)
            {
                Console.WriteLine($"Item {item.Key} has Value {item.Value}");
            }  

Dictionary keys showed

但是当我想使用输入值访问密钥时,我得到异常

enter image description here

怎么了?

2 个答案:

答案 0 :(得分:7)

Console.Read返回字符代码,而不是实际值。

例如,如果您输入&#34; 1&#34;,Console.Read将返回49。

您需要进行一些转换才能将所需的值检索为int:

var input = Console.Read();
var job = DoJob[CharUnicodeInfo.GetDecimalDigitValue((char)input)];    

答案 1 :(得分:1)

Console.Read()返回输入流中下一个字符的int值,字符“1”的值不是1,因此是异常。

https://msdn.microsoft.com/en-us/library/system.console.read(v=vs.110).aspx

可以转换炭使用<击> Convert.ToInt32(输入) CharUnicodeInfo.GetDecimalDigitValue((char)的输入)到int由凯文在回答表明https://stackoverflow.com/a/44735459/7970673