我有一个与 String.Replace 方法相关的问题。首先,我尝试将许多字符串更改为字母,例如,
article = article.Replace('b', 'd').Replace('B', 'D');
article= article.Replace('d', 'g').Replace('D', 'G');
'b' 或 'B' 的字符改变了 'g' 或 'G',而不是我预期的 'd' 或 'D'。有没有其他选择可以解决这个障碍?谢谢..
如果您说b最终成为g,那么这是因为您是:
如果您尝试将b的字符更改为d,然后仅将步骤 1 之前的d字符更改为g的字符,
......然后按相反的顺序执行这些步骤。
这是一个经常重复的任务。我建议创建一个扩展方法。将它放在一个静态类中。在您使用扩展方法的地方,它的命名空间必须是“可见的”。
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
,因为字符串是不可变的。
此外,由于我们一次性完成所有翻译,因此我们避免了您遇到的问题,即已经翻译的字符无意中被第二次翻译。
正如其他人已经指出的那样,您B -> D
首先进行替换,然后进行D -> G
替换。所以你真正在做的是B -> G
and 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());