0

我有一个与 String.Replace 方法相关的问题。首先,我尝试将许多字符串更改为字母,例如,

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

'b' 或 'B' 的字符改变了 'g' 或 'G',而不是我预期的 'd' 或 'D'。有没有其他选择可以解决这个障碍?谢谢..

4

3 回答 3

5

如果您说b最终成为g,那么这是因为您是:

  1. 然后将b更改为d
  2. 将那些d(以及原始d)更改为g

如果您尝试将b的字符更改为d然后将步骤 1 之前的d字符更改为g的字符,
......然后按相反的顺序执行这些步骤。

  1. 然后将d更改为g
  2. 将那些b更改为d
于 2013-04-21T15:52:47.000 回答
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允许您替换文本中的单个字符,这不能直接使用 a 来完成string,因为字符串是不可变的。

此外,由于我们一次性完成所有翻译,因此我们避免了您遇到的问题,即已经翻译的字符无意中被第二次翻译。

于 2013-04-21T16:17:22.447 回答
0

正如其他人已经指出的那样,您B -> D首先进行替换,然后进行D -> G替换。所以你真正在做的是B -> Gand D -> 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 回答