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");
}
任何帮助都是非常欢迎的!
如果您总是用另一个字符替换一个字符,那么最简单的方法可能是将其转换为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
不是必需的,但如果使用静态代码分析工具可以帮助防止出错