【问题标题】:How can I split a string then place each part of the string in text boxes如何拆分字符串然后将字符串的每个部分放在文本框中
【发布时间】:2013-09-30 09:27:01
【问题描述】:
string ip = ini.IniReadValue("Settings", "ip");
string[] ip2 = ip.Split('.');
foreach (var part in ip2)
{
    textBox3.Text = part[0].ToString();
    textBox4.Text = part[1].ToString();
    textBox5.Text = part[2].ToString();
    textBox6.Text = part[3].ToString();
}

大家好,我的问题是 textBox3 里面只有一个 1,而我希望它有 123 为了记录,ip = 123.456.789.101 用于测试目的。

这是结果: .

当它设置 textBox6 时它也会崩溃:索引超出了数组的范围。

【问题讨论】:

    标签: c# string split ip


    【解决方案1】:

    让我们手动跟踪您的代码:

    1. ip2 包含数组 {"123", "456", "789", "101"}
    2. 然后,您将在 foreach 循环中对数组进行迭代,因此 part 依次变为每个字符串 "123""456""789""101"
    3. 然后您将索引到字符串中(带方括号),它访问字符串中的单个chars。所以在第一个循环中,
      • part[0]'1'
      • part[1]'2'
      • part[2]'3',并且
      • part[3] 超出了字符串的范围(长度=3)。

    请注意,您需要致电 ToString() 也是一个很好的指标,可能有问题。

    相反,您想要(没有foreach 循环),

    string ip = ini.IniReadValue("Settings", "ip");
    string[] ip2 = ip.Split('.');
    textBox3.Text = ip2[0];
    textBox4.Text = ip2[1];
    textBox5.Text = ip2[2];
    textBox6.Text = ip2[3];
    

    【讨论】:

      【解决方案2】:

      你的逻辑不正确。

      foreach 循环的每次迭代都是一个完整的字符串。因此,当您这样做时:

      part[NUMBER_HERE]
      

      .. 您正在访问该字符串的该索引处的单个字符。

      你得到的IndexOutOfBounds 错误是因为我上面所说的。如果您访问长度为 3(索引 0、1 和 2)的字符串的索引 3 处的字符。它将超出范围。

      您根本不想要循环。将您的代码更改为:

      string[] parts = ip.Split('.');
      textBox3.Text = parts[0].ToString();
      textBox4.Text = parts[1].ToString();
      textBox5.Text = parts[2].ToString();
      textBox6.Text = parts[3].ToString();
      

      现在你有一个实际的字符串数组,你正在索引......不是单个字符串。

      【讨论】:

        【解决方案3】:

        删除foreach 循环。

        这一行创建了一个数组,其中每个值都在一个新槽中。

        string[] ip2 = ip.Split('.'); 
        

        但是,这会获取数组中的每个单独值并访问其第 n 个插槽。

        foreach (var part in ip2){
             textBox3.Text = part[0].ToString();
             textBox4.Text = part[1].ToString();
             textBox5.Text = part[2].ToString();
             textBox6.Text = part[3].ToString();
        }
        

        它将继续用给定位置上的字符覆盖您的数据(由索引确定)。最后一个条目是101,这就是为什么文本框中的最后一个值是101。 只需删除循环就可以了。

        【讨论】:

          【解决方案4】:

          这是因为您正在迭代拆分的第一个结果。数组 ip2 包含拆分的结果(即 ip2[0]="123")。但是然后你写part[0],并且由于part 包含拆分的第一个结果(无论如何在第一次迭代中),part[0] 现在表示“123”中的第一个字符,当然是“1”。以下是您需要做的:

          string ip = ini.IniReadValue("Settings", "ip");
          string[] ip2 = ip.Split('.');
          
          textBox3.Text = ip2[0].ToString();
          textBox4.Text = ip2[1].ToString();
          textBox5.Text = ip2[2].ToString();
          textBox6.Text = ip2[3].ToString();
          

          理想情况下,在将拆分分配给文本框之前,您还需要检查拆分是否返回了足够的结果。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-01-13
            • 1970-01-01
            • 2020-07-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多