我有一个与String.Replace方法有关的问题。首先,我尝试将许多字符串更改为字母,例如
article = article.Replace('b', 'd').Replace('B', 'D');
article= article.Replace('d', 'g').Replace('D', 'G');
'b'或'B'的字符会改变'g'或'G',而不是'd'或'D'如我所料。还有其他方法可以解决这个障碍吗? 感谢..
答案 0 :(得分:5)
如果您说 b 最终为 g ,那么这是因为您:
如果您尝试将 b 的字符更改为 d ,然后只更改 在步骤1之前 d 的字符进入 g ' s,...
...然后按相反的顺序执行步骤。
答案 1 :(得分: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
,因为字符串是不可变的。
此外,由于我们在一次通过中完成所有翻译,因此我们避免了您遇到的问题,即已翻译的字符已被无意中翻译过。
答案 2 :(得分:0)
正如其他人已经指出的那样,您首先进行B -> D
替换,然后进行D -> G
替换。所以你真正做的是B -> G
和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());