我正在尝试创建一个程序,从控制台读取用户输入的整数,然后创建一个Dictionary<int, int>
,最后输入所有输入的次数。
我的想法是收集每个条目,直到列表中的空行。然后我会解析它并创建字典,输入Key和时间类型为Value。
我在int integer = int.Parse(number);
收到“未处理的异常:System.FormatException:输入字符串的格式不正确”,并且没有打印任何内容。
请您帮我理解代码分崩离析的地方。我是初学者,不知道如何纠正它。
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);
}
}
答案 0 :(得分:2)
考虑使用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");
}
另外,请记住在解析数字和日期时考虑您的文化设置。例如,如果当前语言使用/不使用某些小数分隔符或thaus和分隔符,则最终可能会出现格式异常。如果它是您的一个因素,请考虑使用考虑到它的TryParse版本。
答案 1 :(得分:1)
可能的解决方案
替换
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>)
答案 2 :(得分:0)
您可以尝试在从控制台读取一行后立即直接转换为整数,并将它们添加到整数列表中。这使得一切都更容易理解。例如:
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;
}