【问题标题】:String IndexOf and Substring C#字符串 IndexOf 和子字符串 C#
【发布时间】:2016-06-09 03:45:02
【问题描述】:

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

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

【问题讨论】:

  • 您能否将完整的例外添加到您的问题中?
  • 你到底想从你的字符串中提取什么?多个值还是只有一个特定值?
  • cont.Substring(split + 5) 返回的值似乎不是有效数字,当它尝试转换时,它失败了。

标签: c# string substring indexof


【解决方案1】:

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

当你这样做时

cont.Remove(split);

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

cont = cont.Remove(split);

【讨论】:

    【解决方案2】:

    0val3:1 不是有效数字,因此 int.Parse 失败。如果需要提取此字符串开头的0,可以参考Parse an integer from a string with trailing garbage

    另外,cont.Remove(split); 的结果永远不会在您的代码 sn-p 中使用,因此只会浪费 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]));
    

    【讨论】:

      【解决方案3】:

      您没有将删除结果放回字符串中,请尝试这样做:

      cont = cont.Remove(split);
      

      【讨论】:

        【解决方案4】:

        解决问题的两种方法。

        C# 字符串是不可变的,因此您必须将代码修改为

        cont = cont.Remove(split);
        

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

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

        【讨论】:

          【解决方案5】:

          调用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);
          

          【讨论】:

            【解决方案6】:

            您的问题出在此代码中cont.Remove(split);
            字符串是不可变的,因此您需要重新分配新值。
            为了修复它,您需要编写

            cont = cont.Remove(split);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-06-17
              • 1970-01-01
              • 2018-02-13
              • 2020-07-06
              • 1970-01-01
              • 2018-06-18
              • 2018-09-03
              • 2016-05-25
              相关资源
              最近更新 更多