我正在努力阅读包含这一行字符串的文本文件。并将其值提取到我的整数变量..我想尽量避免使用类或数组。
string cont = "[]val1:1val2:0val3:1";
int split = cont.IndexOf("val3:");
int val3 = Int32.Parse(cont.Substring(split + 5)); // this line successfully convert string to int
cont.Remove(split);
Console.WriteLine("Value3: " + val3 + " Content: " + cont);
split = cont.IndexOf("val2:");
int val2 = Int32.Parse(cont.Substring(split + 5)); // LINE 21
cont.Remove(split);
Console.WriteLine("Value2: " + val2 + " Content: " + cont);
split = cont.IndexOf("val1:");
int SilverCoins = Int32.Parse(cont.Substring(split + 5));
cont.Remove(split);
Console.WriteLine("Value1: " + val1 + " Content: " + cont);
当我运行此代码时,我得到一个未处理的异常,其中指出Input string was not in a correct format, at System.Int32.Parse(String s), line 21
。 :(
所以,我想要的输出应该是
Value3: 1 Content: []val1:1val2:0
Value2: 0 Content: []val1:1
Value1: 1 Content: []
答案 0 :(得分:2)
您的问题出在此代码cont.Remove(split);
中
字符串是不可变的,因此您需要重新分配新值
为了解决这个问题,你需要写
cont = cont.Remove(split);
答案 1 :(得分:2)
您没有将删除结果放回字符串中,请尝试执行以下操作:
cont = cont.Remove(split);
答案 2 :(得分:2)
当我们对字符串执行某些操作时,它不会在同一个字符串实例中进行更改。相反,它返回一个新的字符串实例。这个概念被称为不变性。
当你这样做时
cont.Remove(split);
它不会更新cont
。相反,它返回您需要捕获的更新字符串,如此
cont = cont.Remove(split);
答案 3 :(得分:1)
0val3:1
不是有效数字,因此int.Parse
失败。如果您需要从此字符串的开头提取0
,可以参考Parse an integer from a string with trailing garbage。
此外,cont.Remove(split);
的结果从未在您的代码段中使用,因此只会浪费CPU周期。考虑到你在Console.WriteLine
中注意到这种行为,只是抱怨异常,我只能假设这是故意的?
请注意,您似乎正在尝试从字符串中提取键值对。类似于val([^:]+):([0-9]+)
的正则表达式可能是更好的工具。
或者,您可以在val
上拆分并按冒号的左/右。类似的东西:
var vals = cont.Split(new[] {"val"}, StringSplitOptions.None)
.Skip(1) //ignore any garbage at the beginning
.Select(x => x.Split(':'))
.ToDictionary(x => x[0], x => int.Parse(x[1]));
答案 4 :(得分:1)
缺少调用Remove方法后恢复cont值。
修改后的代码:
string cont = "[]val1:1val2:0val3:1";
int split = cont.IndexOf("val3:");
int val3 = Int32.Parse(cont.Substring(split + 5)); // this line successfully convert string to int
cont = cont.Remove(split);
Console.WriteLine("Value3: " + val3 + " Content: " + cont);
split = cont.IndexOf("val2:");
int val2 = Int32.Parse(cont.Substring(split + 5)); // but this line fails to convert from string to int..
cont = cont.Remove(split);
Console.WriteLine("Value2: " + val2 + " Content: " + cont);
split = cont.IndexOf("val1:");
int val1 = Int32.Parse(cont.Substring(split + 5));
cont = cont.Remove(split);
Console.WriteLine("Value1: " + val1 + " Content: " + cont);
答案 5 :(得分:1)
您可以通过两种方法解决问题。
min
字符串是不可变的,因此您必须将代码修改为
C#
使用cont = cont.Remove(split);
指定长度时,另一种方法(可能最适合您的情况),因此您可以获得指定的字符数。
SubString