C#在循环中操作字符串

C#在循环中操作字符串,c#,string,foreach,C#,String,Foreach,我的项目:基本上,我在车间里编写了一个小的加密程序,它接受用户输入,检查循环中的字符位置是否均匀,如果均匀,则在字符串的前面,否则在结尾。它看起来像这样 string userInput = "", encodedInput = "", evenChar = "", oddChar = ""; int charCount = 0; Console.WriteLine("Input your text: "); userInput = Console.ReadLine(); foreach(c

我的项目:基本上,我在车间里编写了一个小的加密程序,它接受用户输入,检查循环中的字符位置是否均匀,如果均匀,则在字符串的前面,否则在结尾。它看起来像这样

string userInput = "", encodedInput = "", evenChar = "", oddChar = "";
int charCount = 0;

Console.WriteLine("Input your text: ");
userInput = Console.ReadLine();

foreach(char character in userInput)
{
    charCount++;
    if ((charCount % 2) == 0)
    {
        evenChar = evenChar + character;
    }
    else
    {
        oddChar = character + oddChar;
    }
    encodedInput = evenChar + oddChar;
}
Console.WriteLine(encodedInput);
现在这很好,当我输入“嗨,我的名字是杰夫!”时,我得到了“我是aei ef!fjs mny h”

现在我试着写一个解密循环。我选择的破译方法基本上是从字符串中提取最后一个字符,将其添加到新的空字符串中,然后从字符串中提取第一个字符,并将其添加到相同的空字符串中,然后简单地减少加密字符串的总长度,并增加第一个字符的位置

char lastChar = ' ';
char firstChar = ' ';
StringBuilder decodedInput = new StringBuilder();

int len = encodedInput.Length;
int len2 = 0;

foreach(char character in encodedInput)
{
    lastChar = encodedInput[len - 1];
    decodedInput.Append(lastChar.ToString());
    len--;

    firstChar = encodedInput[len2];
    len2++;
    decodedInput.Append(firstChar.ToString());
}

Console.WriteLine(decodedInput.ToString());
现在,这在很大程度上是可行的。它接受相同的“im aei ef!fjs mny h”并输出“hi my name is jeff!!ffej si eman ym ih”。它镜像了字符串,因为对于我生成的每个循环,它都是一个字符,所以“hi my name is jeff”变成36个字符。我试过将循环减半,但你仍然可以得到一些镜像

我很清楚,有更好或更简单的方法来破译这个,但出于教育目的,我想这样做

亲切问候,


Vocaloidas。

不要循环编码输入的每个字符,因为您最终会对每个字符处理两次。您已经在使用
len
len2
变量对字符串进行上下计数,因此如果将
foreach
替换为:

while (len > len2)
这将只处理字符串的每个字符一次

当字符串为奇数字符时,您必须使用一些特殊的大小写来处理中间字符,即
len
len2
相等时。为此,添加以下内容:

            if (len == len2)
                break;
在循环的中间,使其成为:

        while (len > len2)
        {
            lastChar = encodedInput[len - 1];
            decodedInput.Append(lastChar.ToString());
            len--;

            if (len == len2)
                break;

            firstChar = encodedInput[len2];
            len2++;
            decodedInput.Append(firstChar.ToString());
        }

不要在编码输入的每个字符上循环,因为最终会对每个字符进行两次处理。您已经在使用
len
len2
变量对字符串进行上下计数,因此如果将
foreach
替换为:

while (len > len2)
这将只处理字符串的每个字符一次

当字符串为奇数字符时,您必须使用一些特殊的大小写来处理中间字符,即
len
len2
相等时。为此,添加以下内容:

            if (len == len2)
                break;
在循环的中间,使其成为:

        while (len > len2)
        {
            lastChar = encodedInput[len - 1];
            decodedInput.Append(lastChar.ToString());
            len--;

            if (len == len2)
                break;

            firstChar = encodedInput[len2];
            len2++;
            decodedInput.Append(firstChar.ToString());
        }

您可以使用StringBuilder(为了获得更好的性能),在加密部分,evenchar的容量(userInput/2)和奇数char变量的容量(userInput/2+1)。还包括encodedInput=evenChar+oddChar;应该在foreach循环之后。您可以使用StringBuilder(为了获得更好的性能),在加密部分,evenchar的容量(userInput/2)和奇数char变量的容量(userInput/2+1)。还包括encodedInput=evenChar+oddChar;应该在foreach循环之后。你太棒了:)你太棒了:)