簡體   English   中英

字符串IndexOf和子字符串C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM