2009-10-30 35 views
1

我有這樣的字符串在字符串替換兩個字符彼此不使用佔位符的字符

AA b qqidjwljd p fjem

我需要通過更換bpp通過b

AA p qqidjwljd b fjem

的方式,我做這個樣子

myvar.replace("b","1").replace("p","b").replace("1","p") 

這是一種十分可怕的

有更好的方法?

編輯

爲什麼醜嗎?因爲我必須決定/發現,將任何可能的情況下

+1

請在此背景下定義「好」。有很多方法,有各種問題,如內存使用情況,性能等。你會怎樣標榜更好的方法? – 2009-10-30 19:54:49

+0

我不認爲這太難看。 – Armbrat 2009-10-30 19:57:14

+0

這是流利!流利?這個!是!不可變! – 2009-10-30 20:01:06

回答

1

這似乎工作太

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

我想不出在目前更好的工作方式的任意字符集,真的是你的方法是不是難看。

假設有從未字符串中1,這應該只是罰款。

0

都能跟得上。這與標準交換變量問題相同。 (爲了交換的AB值,你需要使用C)。

+0

即使與正則表達式? – 2009-10-30 19:15:10

+0

如果你正在尋找掉在你身邊2個字符還是將其更改爲中介。你不能做一個.Replace( 'B', 'P')。REPLACE( 'P', 'B'),因爲會與所有B的風。所以即使使用Regex,它仍然是一樣的。 – 2009-10-30 19:18:43

+0

謝謝。不知道Regex是否做過所有的操作或鏈接。如果您使用捕獲,我會認爲它已經到位。 – 2009-10-30 19:21:37

2

我想這應該這樣做,我想了很多更具可讀性

 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; 
    } 

沒有贏得開閉原則任何獎項,但!

+2

體面的方法,但我會使用一個StringBuilder而不僅僅是字符串。 – 2009-10-30 19:19:47

+0

是啊,我應該用一個StringBuilder – 2009-10-30 20:17:44

7
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!"); 
}); 
+0

你這該死的正則表達式的專家! :) – 2009-10-30 19:21:08

+0

嘿,不要該死我......反而給我一個投票! :-) – Nestor 2009-10-30 19:28:28

+0

+1哎呀,對不起 - 太忙破譯你的答案... – 2009-10-30 19:34:02

0

你的情況和我在週五下午的想法一樣簡潔。根據什麼替代內部做,這可能會更快:

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); 
0

你的方式工作正常。唯一的問題是如果字符串中有'1',因爲它會導致你的邏輯被破壞。

一個更好的解決辦法是使用一個臨時字符你肯定永遠不會出現在文本中,象一個管道(「|」)或波浪號(「〜」)爲例。