文字の入れ替えは面倒 §
"たろうくんの英語はA、国語はB"という文字列で、あとからAとBが反対であると発覚したとします。文字を置き換えるプログラムは簡単に書けるでしょうか。
s.Replace('A', 'B').Replace('B', 'A')はダメな例です。Replace('A', 'B')を実行した時点で全てのAはBになってしまい、BはBのままですから区別できなくなります。そして、Replace('B', 'A')で全てAに置き換えられます。
s.Replace('A', '\0').Replace('B', 'A').Replace('\0', 'B');は良い例です。\0は通常使用しない文字です。一時的にAをそれに置き換え、BをAに置き換えた後でBに置き換えています。
しかし、【一時的に使用して良い文字】がない場合は、コツコツと地道に置き換えていくしかありません。サンプルソースのforeachを使った処理は一例です。他の方法でも構いません。
罠の数々 §
- '\0'は2文字ではない。円記号(バックスラッシュ)を前置するのは、特殊文字を表記する方法。
参考リンク §
String.Replace メソッド
String.Replace メソッドには、他にもいろいろなバリエーションがある。もし、"たろうくんの英語はA、国語はB"の【たろうくん】を【はなこさん】に置き換えるとしたら、どのバリエーションを使えば効率が良いか、上記のリンクから辿って考えてみよう。
リポジトリ §
https://github.com/autumn009/cshowto
SwapChar §
using System;
using System.Text;
class Program
{
static void Main()
{
var s = "たろうくんの英語はA、国語はB";
var bad = s.Replace('A', 'B').Replace('B', 'A');
Console.WriteLine($"ダメなケース {bad}");
var good1 = s.Replace('A', '\0').Replace('B', 'A').Replace('\0', 'B');
Console.WriteLine($"良いケース1 {good1}");
var good2 = new StringBuilder();
foreach (var item in s) good2.Append(item switch { 'A' => 'B', 'B' => 'A', _ => item });
Console.WriteLine($"良いケース2 {good2.ToString()}");
}
}
実行結果
ダメなケース たろうくんの英語はA、国語はA
良いケース1 たろうくんの英語はB、国語はA
良いケース2 たろうくんの英語はB、国語はA