QA@IT
«質問へ戻る

質問を投稿

C#のString.IndexOfの仕様

文字列を操作する箇所でわからない動作をする箇所がありましたので、
もしわかる方がいらっしゃいましたら教えてください。

以下のような箇所でなぜか無限ループが発生してしまいます。



// 全角のハイフン
string h = "−";
// ハイフン二つ
string d = h + h;
StringBuilder sb = new StringBuilder("千代田区丸の内一−Oct−〇〇−");
while (sb.ToString().IndexOf(d) != -1) { // ここで見つかったと認識される
    sb.Replace(d, h);          // 実際にはないのでここで変換はされない
}

なぜかこれで無限ループが発生してしまいます。
ステップ実行で見ると、while文の条件内のIndexOfの戻り値が整数(−−が見つかった)
と認識されてしまってるようなのですが、
実際のデータには−−は含まれないのでReplaceでは何も起きなくて、
延々とループになってるようです。
−−に一致してると見なされるのは−と英字の並ぶ辺りなのですが、
−と英字が並んで−−に一致すると見なされるようなことはあるのでしょうか?
また、これは文字コードが何かからんでる問題なのでしょうか?

もしこれの原因に思い当たる方がいらっしゃいましたら、どうぞご教授をお願いいたします。

質問者:めー

文字列を操作する箇所でわからない動作をする箇所がありましたので、
もしわかる方がいらっしゃいましたら教えてください。

以下のような箇所でなぜか無限ループが発生してしまいます。


~~~


// 全角のハイフン
string h = "−";
// ハイフン二つ
string d = h + h;
StringBuilder sb = new StringBuilder("千代田区丸の内一−Oct−〇〇−");
while (sb.ToString().IndexOf(d) != -1) { // ここで見つかったと認識される
    sb.Replace(d, h);          // 実際にはないのでここで変換はされない
}

~~~

なぜかこれで無限ループが発生してしまいます。
ステップ実行で見ると、while文の条件内のIndexOfの戻り値が整数(−−が見つかった)
と認識されてしまってるようなのですが、
実際のデータには−−は含まれないのでReplaceでは何も起きなくて、
延々とループになってるようです。
−−に一致してると見なされるのは−と英字の並ぶ辺りなのですが、
−と英字が並んで−−に一致すると見なされるようなことはあるのでしょうか?
また、これは文字コードが何かからんでる問題なのでしょうか?

もしこれの原因に思い当たる方がいらっしゃいましたら、どうぞご教授をお願いいたします。


質問者:めー