输入字符串的格式不正确,List<String> 到 Dictionary<int, int>

Input string was not in a correct format, List<String> to Dictionary<int, int>

我正在尝试创建一个程序,从控制台读取用户输入的整数,然后创建一个 Dictionary<int, int>,最后打印所有输入及其输入次数。 我的想法是收集每个条目,直到列表中出现一个空行。然后我会解析它并创建字典,其中包含键的输入和键入值的时间。

我在 int integer = int.Parse(number); 得到 "Unhandled Exception: System.FormatException: Input string was not in a correct format",但没有打印任何内容。

你能帮我理解代码在哪里崩溃吗?我是初学者,不知道如何改正。

static void Main(string[] args)
    {
        string input = "0";
        List<string> listNumbers = new List<string>();
        Console.WriteLine("Type several numbers and press Enter after each one:");
        while (input != string.Empty)
        {
            input = Console.ReadLine();
            listNumbers.Add(input);
        }

        IDictionary<int, int> intOccurences = new Dictionary<int, int>();
        foreach (string number in listNumbers)
        {
            int integer = int.Parse(number);
            int count;
            if (!intOccurences.TryGetValue(integer, out count))
            {
                count = 0;
            }
                intOccurences[integer] = count + 1;
        }
        PrintNumbers(intOccurences);
    }
        private static void PrintNumbers(IDictionary<int, int> intOccurences)
    {
        foreach (KeyValuePair<int, int> entry in intOccurences)
        {
            Console.WriteLine(
                "Number '{0}' occurs {1} time (s) in the input.", entry.Key, entry.Value);
        }
    }

可能的解决方案

替换

int integer = int.Parse(number);

int integer;

var isInteger = int.TryParse(number, out integer);

if(!isInteger) continue; // Not a number skip

if (!intOccurences.TryGetValue(integer, out count))
{
                count = 0;
}
  • 想法仍然存在,跳过非整数,否则设计一种机制来处理它们。你不能int.parse(<Non Integer>)

您可以尝试在从控制台读取一行后立即直接转换为整数,并将它们添加到整数列表中。这也使一切都更容易理解。例如:

IDictionary<int, int> intOccurences = new Dictionary<int, int>();
List<int> allInputs = new List<int>();
while (input != string.Empty)
{
    input = Console.ReadLine();
    allInputs.Add(Convert.ToInt32(input));
}
foreach (int i in allInputs)
{
    int currentCount; //defaults to 0
    intOccurences.TryGetValue(i, out currentCount);
    frequencies[i] = currentCount + 1;
}

考虑使用 TryParse:

        string possibleInteger ="12";
        int resultInteger;
        bool isCorrectInteger = int.TryParse(possibleInteger, out resultInteger);
        if (isCorrectInteger)
        {
            // add to dictionary
        }
        else
        {
            Console.WriteLine("Not a correct integer number");
        }

此外,请记住在解析数字和日期时考虑您的文化设置。例如,如果当前语言 uses/doesn 不使用某些小数点分隔符或万进制分隔符,您可能会遇到格式异常。如果这是您的一个因素,请考虑使用考虑到它的 TryParse 版本。