String IndexOf和Substring C#

时间:2016-02-26 03:45:17

标签: c# string substring indexof

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

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: []

6 个答案:

答案 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