如何交换字符串中的字符

时间:2015-02-11 17:08:17

标签: c#

我要告诉我这很简单,但我如何同时将所有A变为B,将所有B变为A,变为字符串,s。

s= s.Replace( 'A', 'B').Replace( 'B', 'A');

显然不是很有效,所以正确的方法是什么?

7 个答案:

答案 0 :(得分:6)

您可以使用linq替换字符:

string s = "ABZBA";
var result= s.Select(x=> x == 'A' ? 'B' : (x=='B' ? 'A' : x)).ToArray();
s = new String(result);

输出:

  
    

BAZAB

  

答案 1 :(得分:4)

使用Regex.ReplaceMatchEvaluator来完成这项工作。如果AB变得更加复杂,这将处理超过单个字符的字符串:

s = Regex.Replace(s, "A|B", (m) => m.Value == "A" ? "B" : "A");

答案 2 :(得分:3)

将字符串复制到StringBuilder并按字符进行替换是实现此目的的一种方法:

var s = new StringBuilder(originalString);
for (int i = 0 ; i != s.Length ; i++) {
    var ch = s.Characters[i];
    if (ch == 'A') { s.Characters[i] = 'B'; }
    else if (ch == 'B') { s.Characters[i] = 'A'; }
}
originalString = s.ToString();

如果您希望使用Replace,并且确保字符串中没有字符,则可以使用与使用临时变量进行交换的方式相同的方式执行此操作:

s= s.Replace( 'A', '~').Replace( 'B', 'A').Replace( '~', 'B');

以上假设原始字符串中不存在~

答案 3 :(得分:2)

迭代s的字符,如果您发现AB(反之亦然)。

StringBuilder newString = new StringBuilder(s.Length);
foreach(var ch in s)
{
    if (ch == 'A') newString.Append('B');
    else if (ch == 'B') newString.Append('A');
    else newString.Append(ch);
}

s = newString.ToString();

答案 4 :(得分:2)

你可以试试这个:

string s = "ABABAB";
char placeholder = '~';

//After this s is BABABA
s = s.Replace('A', placeholder).Replace('B', 'A').Replace(placeholder, 'B');

答案 5 :(得分:2)

解决问题的方法可能是:

 string s = "AABB";
 var dict = new Dictionary<char, char> {{'A', 'B'}, {'B', 'A'}};

 s = new string(s.Select(c => dict.ContainsKey(c) ? dict[c] : c).ToArray());

这样您可以替换所需的所有字符,只需将键/值对添加到字典

即可

答案 6 :(得分:2)

我最终得到了这种扩展方法:

string Swap( this string s, char a, char b, char unused)
{
    return s.Replace( a, unused).Replace( b, a).Replace( unused, b);
}

然后我把它改为:

string Swap( this string s, char a, char b)
{
    return new string( s.Select( ch => (ch == a) ? b :(ch == b) ? a : ch).ToArray());
}