0

String.Replace メソッドに関連する問題があります。まず、多くの文字列をアルファベットとして変更しようとします。たとえば、

article = article.Replace('b', 'd').Replace('B', 'D');
article= article.Replace('d', 'g').Replace('D', 'G');

'b' または 'B' の char は、予想どおり 'd' または 'D' ではなく、'g' または 'G' を変更します。この障害を解決する他のオプションはありますか? ありがとう..

4

3 に答える 3

5

bgになると言っている場合、これは次の理由によるものです。

  1. bdに変更すると、
  2. これらのdを (元のdと同様に) gに変更する

bの文字をdに変更し、ステップ 1 の前にdだった文字のみをg変更しようとしている場合は、... ...逆の順序でステップを実行します。

  1. dgに変更すると、
  2. これらのbdに変更する
于 2013-04-21T15:52:47.000 に答える
0

他の人がすでに指摘しているように、B -> D最初に交換を行い、次に交換を行いD -> Gます。つまり、あなたが実際に行っているのはB -> GandD -> Gです。

置換の正しい順序を選択するというこの問題を回避する宣言的な方法は、次のとおりです。

var map = new Dictionary<char, char>
{
    { 'b', 'd' },
    { 'B', 'D' },
    { 'd', 'g' },
    { 'D', 'G' }
};

article = new string(article
    .Select(x => map.ContainsKey(x) ? map[x] : x)
    .ToArray());
于 2013-04-21T17:49:39.850 に答える
0

これは頻繁に繰り返されるタスクです。拡張メソッドを作成することをお勧めします。静的クラスに配置します。その名前空間は、拡張メソッドを使用している場所で「見える」必要があります。

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 回翻訳されてしまうという問題を回避できます。

于 2013-04-21T16:17:22.447 に答える