2016-12-07 54 views
2

我正在閱讀文本文件,並試圖用新文字替換所有字符。根據我閱讀的字符,我想添加13或減去13.我的問題是,一旦我將'a'更改爲'n',當我到達'n'並嘗試減去時,它會變回'a'。因爲所有'a'應該是'n'並且所有'n'應該是'a'。C#加減字符串中的字符

while ((inValue = inFile.ReadLine()) != null) { 
    for (int letter = 'A'; letter < 'z'; letter++) 
    { 
     if (letter >= 'A' && letter <= 'M') 
      inValue = inValue.Replace((char)letter, (char) (letter + 13)); 
     else if (letter >= 'N' && letter <= 'Z') 
      inValue = inValue.Replace((char)letter, (char)(letter - 13)); 
     else if (letter >= 'a' && letter <= 'm') 
      inValue = inValue.Replace((char)letter, (char)(letter + 13)); 
     else if (letter >= 'n' && letter <= 'z') 
      inValue = inValue.Replace((char)letter, (char)(letter - 13)); 
    } 
} 
+0

在'while'循環的結束髮生'inValue'什麼? – JamesFaix

回答

2

您需要跟蹤字符串中的哪個字符已被更改,因此您不需要再次更改它。更容易地瀏覽輸入字符串中的每個字符並進行更改 - 這樣您就知道它只會被更改一次。

while ((inValue = inFile.ReadLine()) != null) { 
    // convert to StringBuilder because you can't change the characters within a string 
    var sb = new StringBuilder(inValue); 
    for (int i = 0; i < inValue.Length; i++) 
    { 
     char letter = sb[i]; 
     if (letter >= 'A' && letter <= 'M') 
      sb[i] = (char)(letter + 13); 

     else if (letter >= 'N' && letter <= 'Z') 
      sb[i] = (char)(letter - 13); 

     else if (letter >= 'a' && letter <= 'm') 
      sb[i] = (char)(letter + 13); 

     else if (letter >= 'n' && letter <= 'z') 
      sb[i] = (char)(letter - 13); 
     } 
    } 
    inValue = sb.ToString(); // Convert back to string 
    // ... ... ... do something with `inValue` 
} 
0

這是因爲當你仍然在for循環中時,你正在改變它們。跟蹤需要替換的每個字符的索引以及需要去的地方。循環結束後,繼續遍歷一個字典,該字典將包含

int:index; char:replacementChar。

所以這些方針的東西:

for (int letter = 'A'; letter < 'z'; letter++) 
{ 
    var charTracker = new Dictionary<int, char>(); 
    char replacement; 
    if (letter >= 'A' && letter <= 'M') 
     replacement = (char)(letter-13); 
    else if (letter >= 'N' && letter <= 'Z') 
     replacement = (char)(letter-13)); 
    else if (letter >= 'a' && letter <= 'm') 
     replacement = (char)(letter + 13)); 
    else if (letter >= 'n' && letter <= 'z') 
     replacement = (char)(letter - 13)); 

    charTracker.Add(letter, replacement); 
} 

for(var i = 0; i < charTracker.Length -1; i++) 
{ 
    // Logic to replace chars here 
}