これは頻繁に繰り返されるタスクです。拡張メソッドを作成することをお勧めします。静的クラスに配置します。その名前空間は、拡張メソッドを使用している場所で「見える」必要があります。
public static string TranslateChars(this string s, string originalChars,
string replacementChars)
{
if (String.IsNullOrEmpty(s)) {
return s;
}
if (originalChars == null) {
throw new ArgumentNullException(originalChars);
}
if (replacementChars == null) {
throw new ArgumentNullException(replacementChars);
}
if (originalChars.Length != replacementChars.Length) {
throw new ArgumentException(
"'originalChars' and 'replacementChars' must have same length.");
}
// Fill translation dictionary
var translations = new Dictionary<char, char>(originalChars.Length);
for (int i = 0; i < originalChars.Length; i++) {
translations.Add(originalChars[i], replacementChars[i]);
}
//Translate
var sb = new StringBuilder(s);
for (int i = 0; i < sb.Length; i++) {
char replacement;
if (translations.TryGetValue(sb[i], out replacement)) {
sb[i] = replacement;
}
}
return sb.ToString();
}
あなたの問題に適用されます:
article = article.TranslateChars("bBdD","dDgG");
注:StringBuilder
を使用すると、テキスト内の単一の文字を置き換えることができます。これはstring
、文字列は不変であるため、 で直接行うことはできません。
また、すべての翻訳を 1 回のパスで行うため、既に翻訳された文字が誤って 2 回翻訳されてしまうという問題を回避できます。