.net 在字符串中相互替换两个字符,而不使用占位符字符

.net 在字符串中相互替换两个字符,而不使用占位符字符,.net,regex,linq,.net,Regex,Linq,我有这根绳子 aabqqidjwljdpfjem 我需要用p替换b,用b替换p aapqqidjwljdbfjem 我这样做的方式看起来是这样的 这真的有点难看 有更好的办法吗 编辑 为什么很丑?因为我必须决定/找到一组适用于任何可能情况的任意字符目前我想不出更好的方法,实际上你的方法并没有那么难看 假设字符串中没有1,它应该可以正常工作。我现在想不出更好的方法,实际上你的方法并没有那么难看 假设字符串中没有1,它应该可以正常工作。没有。这与标准的交换变量问题是一样的。为了交换A和B的值,需要使

我有这根绳子

aabqqidjwljdpfjem

我需要用p替换b,用b替换p

aapqqidjwljdbfjem

我这样做的方式看起来是这样的

这真的有点难看

有更好的办法吗

编辑


为什么很丑?因为我必须决定/找到一组适用于任何可能情况的任意字符

目前我想不出更好的方法,实际上你的方法并没有那么难看


假设字符串中没有1,它应该可以正常工作。

我现在想不出更好的方法,实际上你的方法并没有那么难看


假设字符串中没有1,它应该可以正常工作。

没有。这与标准的交换变量问题是一样的。为了交换A和B的值,需要使用C。

否。这与标准的交换变量问题是一样的。为了交换A和B的值,需要使用C。

我认为应该这样做,我认为它更具可读性

      private static string Transpose(string s)
  {
     string output = "";
     foreach (char c in s)
     {

        switch (c)
        {
           case 'P':
              output += 'B';
              break;
           case 'B':
              output += 'P';
              break;
           default:
              output += c;
              break;
        }
     }
     return output;
  }

虽然开闭原则没有赢得任何奖品

我认为应该这样做,我认为它更具可读性

      private static string Transpose(string s)
  {
     string output = "";
     foreach (char c in s)
     {

        switch (c)
        {
           case 'P':
              output += 'B';
              break;
           case 'B':
              output += 'P';
              break;
           default:
              output += c;
              break;
        }
     }
     return output;
  }
string sold = "aa**b**qqidjwljd**p**fjem";
string snew = Regex.Replace(sold, "(?<replace>b|p)", delegate(Match p)
{
    switch (p.Groups["replace"].Value)
    {
        case "b": return "p";
        case "p": return "b";
    };
    throw new ApplicationException("Should never happen!");
});

虽然开闭原则没有赢得任何奖品

你的演讲就像我在周五下午所能想到的那样简洁。根据Replace在内部执行的操作,这可能会更快:

string sold = "aa**b**qqidjwljd**p**fjem";
string snew = Regex.Replace(sold, "(?<replace>b|p)", delegate(Match p)
{
    switch (p.Groups["replace"].Value)
    {
        case "b": return "p";
        case "p": return "b";
    };
    throw new ApplicationException("Should never happen!");
});
    char [] myChars = "aa**b**qqidjwljd**p**fjem".ToCharArray();

    for (int x = 0; x < myChars.Length; x++)
    {
        char currentCharacter = myChars[x];
        if (currentCharacter == 'b')
        {
            myChars[x] = 'p';
        }
        else if (currentCharacter == 'p')
        {
            myChars[x] = 'b';
        }
    }

    string myString = new string(myChars);

你的书是我在星期五下午所能想到的最简洁的。根据Replace在内部执行的操作,这可能会更快:

    char [] myChars = "aa**b**qqidjwljd**p**fjem".ToCharArray();

    for (int x = 0; x < myChars.Length; x++)
    {
        char currentCharacter = myChars[x];
        if (currentCharacter == 'b')
        {
            myChars[x] = 'p';
        }
        else if (currentCharacter == 'p')
        {
            myChars[x] = 'b';
        }
    }

    string myString = new string(myChars);

你的方式很好。唯一的问题是字符串中是否有“1”,因为它会导致逻辑损坏


更好的解决方案是使用一个您确信永远不会出现在文本中的临时字符,例如管道“|”或瓷砖“~”。

您的方式很好。唯一的问题是字符串中是否有“1”,因为它会导致逻辑损坏

更好的解决方案是使用一个您确信永远不会出现在文本中的临时字符,例如管道“|”或波浪形“~”。

这似乎也适用

var a = "aa**b**qqidjwljd**p**fjem";
a = new string((from n in a select (n == 'b' ? 'p' : (n == 'p' ? 'b' : n))).ToArray());
这似乎也行

var a = "aa**b**qqidjwljd**p**fjem";
a = new string((from n in a select (n == 'b' ? 'p' : (n == 'p' ? 'b' : n))).ToArray());

如果你想交换2个字符,你仍然需要把它改成中间字符。你不能做a。替换“B”,“P”。替换“P”,“B”,因为你会得到所有的B。因此,即使使用Regex,它仍然是一样的。谢谢。不确定Regex是否所有操作都到位或链接。如果您使用的是捕获,我会假设它已经就位。或者您可以查看Nestor的答案,将其作为一个组来执行…:如果您希望交换2个字符,您仍然必须将其更改为中间字符。你不能做a。替换“B”,“P”。替换“P”,“B”,因为你会得到所有的B。因此,即使使用Regex,它仍然是一样的。谢谢。不确定Regex是否所有操作都到位或链接。如果你使用的是捕获,我会假设它已经就位。或者你可以看看Nestor的答案,将其作为一个组来完成…:不错的方法,但我会使用StringBuilder而不仅仅是字符串。是的,我应该使用stringbuilderDecent方法,但是我会使用StringBuilder而不仅仅是字符串。是的,我应该使用stringbuilderPlease来更好地定义这个上下文。有很多方法,有各种各样的问题,比如内存使用、性能等。你认为哪种方法更好?我不认为这太难看。这很流畅!流利这是不变的请在此上下文中更好地定义。有很多方法,有各种各样的问题,比如内存使用、性能等。你认为哪种方法更好?我不认为这太难看。这很流畅!流利这是不变的