【问题标题】:The given key was not present in the dictionary. c#字典中不存在给定的键。 C#
【发布时间】:2017-06-24 10:25:18
【问题描述】:

我想使用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}");
            }  

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

怎么了?

【问题讨论】:

标签: c# dictionary exception


【解决方案1】:

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

例如,如果您输入“1”,Console.Read 将返回 49。

您需要进行一些转换才能以 int 形式检索所需的值:

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

【讨论】:

    【解决方案2】:

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

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

    您可以使用 Convert.ToInt32(input) CharUnicodeInfo.GetDecimalDigitValue((char)input) 将 char 转换为 int,正如 Kevin https://stackoverflow.com/a/44735459/7970673 的回答所建议的那样

    【讨论】:

    • 您想到的是编译错误。你的建议不能解决问题,char '1' 转换为 int 49: ideone.com/SpWNqA
    • 是的,我的错。我之前建议的修复是行不通的。因此更新了我的答案
    猜你喜欢
    • 2012-02-18
    • 2018-01-12
    • 2016-08-14
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多