C# - 处理string.replace中的矛盾

时间:2014-08-21 16:24:31

标签: c# string replace

我开始使用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");
}

任何帮助都会受到超级欢迎!

3 个答案:

答案 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不是必需的,但如果使用静态代码分析工具来防止出错,可以提供帮助。