1
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 を入れたいということです。

結果は次のとおり 結果です。

また、textBox6: Index was outside of the array を設定するとクラッシュします。

4

4 に答える 4

3

コードを手動でトレースしてみましょう。

  1. ip2には配列が含まれます{"123", "456", "789", "101"}
  2. foreach次に、ループ内の配列を反復処理しているためpart、各文字列が順番"123""456""789""101"になります。
  3. 次に、文字列内の個々の s にアクセスする文字列に (角括弧で) インデックスを付けcharます。したがって、最初のループスルーでは、
    • 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];
于 2013-09-24T23:46:58.167 に答える
1

あなたの論理は正しくありません。

ループのすべての反復は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();

これで、インデックスを作成している実際の文字列配列ができました..単一の文字列ではありません。

于 2013-09-24T23:44:26.520 に答える
1

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。これが、テキスト ボックスの最後の値が と である1理由0です1。ループを外すだけで大丈夫です。

于 2013-09-24T23:45:10.760 に答える
0

これは、分割の最初の結果を反復処理しているためです。配列 ip2 には、分割の結果が含まれます (つまり、ip2[0]="123")。しかし、次に を書きます。partpart[0]には分割の最初の結果が含まれているため (とにかく最初の反復で)、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();

理想的には、分割をテキストボックスに割り当てる前に、分割が十分な結果を返したかどうかを確認する必要があります。

于 2013-09-24T23:46:40.987 に答える