[英]String IndexOf and Substring C#
我正在努力閱讀包含此字符串行的文本文件。 並將其值提取到我的整數變量中。我想避免使用Class或Arrays。
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
,顯示未處理的異常,指出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: []
您的問題在這段代碼中cont.Remove(split);
字符串是不可變的,因此您需要重新分配新值。
為了解決它,你需要寫
cont = cont.Remove(split);
您沒有將刪除結果放回字符串中,請嘗試這樣做:
cont = cont.Remove(split);
當我們對字符串執行某些操作時,它不會在同一字符串實例中進行更改。 而是返回一個新的字符串實例。 這個概念被稱為不變性 。
當你做
cont.Remove(split);
它不會更新cont
。 相反,它返回更新的字符串,您需要像這樣捕獲
cont = cont.Remove(split);
0val3:1
不是有效數字,因此int.Parse
失敗。 如果需要從此字符串的開頭提取0
,則可以引用帶有尾隨垃圾的字符串解析整數 。
同樣, cont.Remove(split);
的結果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]));
缺少調用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);
您可以通過兩種方式解決問題。
C#
字符串是不可變的,因此您必須將代碼修改為
cont = cont.Remove(split);
另一種方法(可能是最適合您的情況),在使用SubString
指定長度時,您將獲得指定數量的字符。
split = cont.IndexOf("val2:");
int val2 = Int32.Parse(cont.Substring(split + 5, 1));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.