C#在字符串中添加和减去字符

时间:2016-12-07 05:00:30

标签: c# .net

我正在从文本文件中读取并尝试用新文件替换所有字符。根据我读到的字符,我想添加13或减去13.我的问题是,一旦我将'a'改为'n',当我到'n'并尝试减去时它会变回'a'。例如,'a'应为'n',所有'n'应为'a'。

<embed>

2 个答案:

答案 0 :(得分: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`
}

答案 1 :(得分:0)

这是因为当你还在for循环中时你正在改变它们。跟踪需要更换的每个字符的索引以及需要去的内容。循环结束后,继续循环包含

的Dictionary

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
}