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

本文关键字:矛盾 replace -处理 string | 更新日期: 2023-09-27 18:19:09

我开始学习c#和一般编程,我一直在玩"if"语句,数组和一般掌握的东西。然而,有一件事难倒了我,那就是如何执行一个内在矛盾的替换操作。

IE:我有字符串"AAABBB",但我想通过我的文本搜索,并将所有"A"替换为"B",反之亦然。所以我的预期输出将是"BBBAAA"。

我正在尝试使用字符串。replace和if语句,但它不起作用(它遵循语句的顺序,所以在上面的例子中,我将得到所有"A"或所有"B"。

代码示例:

if (string.Contains("a"));
{
    string = string.Replace("a", "b");
}
if (string.Contains("b"));
{
    string = string.Replace("b", "a");
}

任何帮助都是非常欢迎的!

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

如果您总是用另一个字符替换一个字符,那么最简单的方法可能是将其转换为char[]并一次检查一个字符,适当地修复每个字符-而不是做"所有的a"然后"所有的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);
}

考虑使用Linq:

s = new string(s.Select(x => x == 'A' ? 'B' : x == 'B' ? 'A' : x).ToArray());

失败的原因是所有的A 's首先被B 's替换,然后又回到A 's。

解决这个问题的一般方法如下:

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