我开始使用C#和编程一般而且我一直在使用“if”语句,数组并且通常会掌握一些东西。然而,让我感到困惑的一件事就是如何进行本质上相互矛盾的替换操作。
IE:我有字符串“AAABBB”,但我想搜索我的文本并将所有“A”替换为“B”,反之亦然。所以我的预期输出将是“BBBAAA”。
我目前正在尝试使用string.replace和if语句,但它不起作用(它遵循语句的顺序,因此在上面的示例中,我将获得所有“A”或全部“B”。
代码示例:
if (string.Contains("a"));
{
string = string.Replace("a", "b");
}
if (string.Contains("b"));
{
string = string.Replace("b", "a");
}
任何帮助都会受到超级欢迎!
答案 0 :(得分:10)
如果您总是将一个字符替换为另一个字符,最简单的方法是将其转换为char[]
并一次检查一个字符,并相应地修复每个字符 - 而不是做"所有As"然后"所有的B"。
public static string PerformReplacements(string text)
{
char[] chars = text.ToCharArray();
for (int i = 0; i < chars.Length; i++)
{
switch (chars[i])
{
case 'A':
chars[i] = 'B';
break;
case 'B':
chars[i] = 'A';
break;
}
}
return new string(chars);
}
答案 1 :(得分:4)
考虑使用Linq:
s = new string(s.Select(x => x == 'A' ? 'B' : x == 'B' ? 'A' : x).ToArray());
答案 2 :(得分:2)
这种失败的原因是因为所有A
首先被B
替换,但随后又回到A
&#39}。
解决此问题的一般方法如下:
using System.Linq;
using System.Text;
using System.Diagnostics.Contracts;
public class Foo {
public static string ParallelReplace (string text, char[] fromc, char[] toc) {
Contract.Requires(text != null);
Contract.Requires(fromc != null);
Contract.Requires(toc != null)
Contract.Requires(fromc.Length == toc.Length);
Contract.Ensures(Contract.Result<string>().Length == text.Length);
Array.Sort(fromc,toc);
StringBuilder sb = new StringBuilder();
foreach(char c in text) {
int i = Array.BinarySearch(fromc,c);
if(i >= 0) {
sb.Append(toc[i]);
} else {
sb.Append(c);
}
}
return sb.ToString();
}
}
使用csharp
交互式shell进行演示:
csharp> Foo.ParallelReplace("ABasdsadsadaABABB",new char[] {'b','a','s'},new char[] {'f','s','a'});
"ABsadasdasdsABABB"
这表示映射{b->f,a->s,s->a}
。该方法适用于O(s*log(n)+n*log(n))
,其中s
为字符串的长度,n
为规则数。
Contract
不是必需的,但如果使用静态代码分析工具来防止出错,可以提供帮助。