2016-02-26 73 views
1

我正在努力阅读包含这一行字符串的文本文件。并将其值取到我的整数变量..我想尽量避免使用类或数组。String IndexOf和Substring C#

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

你可以添加完整的例外到你的问题? – kondrak

+0

你究竟想从字符串中提取什么?许多价值或只是一个特定的价值? – ohiodoug

+0

看起来'cont.substring(split + 5)'返回的值不是有效数字,当它尝试转换时,它失败。 –

回答

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); 
2

您的问题是在此代码cont.Remove(split);
字符串是不可改变的,所以你需要重新分配新的价值。
为了解决这个问题,你需要写

cont = cont.Remove(split); 
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])); 
1

两种方法可以解决这个问题。

C#字符串是不可改变的,所以你必须修改代码以

cont = cont.Remove(split); 

另一种方法(可能是最适合你的情况下),使用SubString指定长度,让您获得指定的字符数时。

split = cont.IndexOf("val2:"); 
int val2 = Int32.Parse(cont.Substring(split + 5, 1)); 
2

你是不是把删除结果回字符串,试试这样做:

cont = cont.Remove(split); 
2

当我们对字符串进行某些操作它不会使在相同的字符串实例的变化。相反,它返回一个新的字符串实例。这个概念被称为不变性

当你

cont.Remove(split); 

它不更新cont。相反,它返回更新的字符串,你需要像这样捕获

cont = cont.Remove(split);