2016-02-26 2 views
1

Я работаю над чтением текстового файла, который содержит эту строку строки. И получить его значение для моих целочисленных переменных. Я хочу попытаться избежать использования класса или массивов.Строка IndexOf и подстрока 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

Восстановление промежуточного значения после вызова метода удаления отсутствует.

Модифицированный код:

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); никогда не используется в вашем фрагменте кода и, следовательно, не делает ничего, кроме отработанных циклов процессора. Учитывая, что вы замечаете это поведение в 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); 
Смежные вопросы