1

我真的不擅长解释事情,但我会尽力而为。

我正在制作一个小程序,可以在您键入时将一个单词转换为另一个单词。键入的每个字母都会经过这部分代码,根据整个单词的索引位置将其更改为不同的字母。

我的问题是,当有重复的字母时,重复的字母不会根据它们在单词中的位置而改变,而是根据第一次出现而改变。

例如,这组成了单词“bacca”。如果你把它放在代码中,它应该改为“vrwiy”,但改为“vrwwr”。我也知道为什么会这样。这是因为 switch 语句循环遍历需要转换的单词。但是,我不知道如何根据每个字符在字符串索引中的位置来更改每个字符。我认为 LastIndexOf() 方法可能会起作用,但它只是颠倒了顺序。所以如果我输入字母“a”,它会输出为“n”,但如果我输入“aa”,它会将第一个“a”切换为“r”,因为第二个在 IndexOf 1 get 更改为“r”。

private void inputTbox_TextChanged(object sender, EventArgs e)
{
    List<string> rawZnWordList = new List<string>();
    foreach (char a in inputTextBox.Text) 
    {
        switch (inputTextBox.Text.IndexOf(a)) 
        {
            case 0: 
                switch (a) 
                {
                    case 'a':
                        rawZnWordList.Add("n");
                        continue;
                    case 'b':
                        rawZnWordList.Add("v");
                        continue;
                    case 'c':
                        rawZnWordList.Add("a");
                        continue;
                    default:
                        break;
                }

                continue;
            case 1:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("r");
                        continue;
                    case 'b':
                        rawZnWordList.Add("x");
                        continue;
                    case 'c':
                        rawZnWordList.Add("z");
                        continue;
                    default:
                        break;
                }
                continue;
            case 2:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("t");
                        continue;
                    case 'b':
                        rawZnWordList.Add("l");
                        continue;
                    case 'c':
                        rawZnWordList.Add("w");
                        continue;
                    default:
                        continue;
                }
                continue;
            case 3:
                switch (a) 
                {
                    case 'a':
                        rawZnWordList.Add("u");
                        continue;
                    case 'b':
                        rawZnWordList.Add("i");
                        continue;
                    case 'c':
                        rawZnWordList.Add("o");
                        continue;
                    default:
                        break;
                }
                continue;
            case 4:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("y");
                        continue;
                    case 'b':
                        rawZnWordList.Add("m");
                        continue;
                    case 'c':
                        rawZnWordList.Add("d");
                        continue;
                    default:
                        break;
                }
                continue;
            default:
                break;
        }
    }
    string finalZnWord = string.Join("", rawZnWordList.ToArray()); 
    outputTextBox.Text = finalZnWord;
}
4

3 回答 3

1

您应该尝试使用for循环,如下所示:

for (int i = 0; i < inputTextBox.Text.Length; i++) 
    {
        char a = inputTextBox.Text[i];
        switch (i) 
        {
            case 0: 
                switch (a) 
                ...

希望这可以帮助 ;)。

于 2013-03-31T04:29:21.063 回答
0

您需要跟踪您内部的索引,foreach而不是使用.IndexOf. 您也可以使用常规for循环而不是 a,foreach但这种方式对您的代码的更改很小。

private void inputTbox_TextChanged(object sender, EventArgs e)
{
    List rawZnWordList = new List();
    int index = 0;
    foreach (char a in inputTextBox.Text) 
    {
        switch (index) 
        {
            case 0: 
                switch (a) 
                {
                    case 'a':
                        rawZnWordList.Add("n");
                        continue;
                    case 'b':
                        rawZnWordList.Add("v");
                        continue;
                    case 'c':
                        rawZnWordList.Add("a");
                        continue;
                    default:
                        break;
                }
                continue;
            case 1:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("r");
                        continue;
                    case 'b':
                        rawZnWordList.Add("x");
                        continue;
                    case 'c':
                        rawZnWordList.Add("z");
                        continue;
                    default:
                        break;
                }
                continue;
            case 2:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("t");
                        continue;
                    case 'b':
                        rawZnWordList.Add("l");
                        continue;
                    case 'c':
                        rawZnWordList.Add("w");
                        continue;
                    default:
                        continue;
                }
                continue;
            case 3:
                switch (a) 
                {
                    case 'a':
                        rawZnWordList.Add("u");
                        continue;
                    case 'b':
                        rawZnWordList.Add("i");
                        continue;
                    case 'c':
                        rawZnWordList.Add("o");
                        continue;
                    default:
                        break;
                }
                continue;
            case 4:
                switch (a)
                {
                    case 'a':
                        rawZnWordList.Add("y");
                        continue;
                    case 'b':
                        rawZnWordList.Add("m");
                        continue;
                    case 'c':
                        rawZnWordList.Add("d");
                        continue;
                    default:
                        break;
                }
                continue;
            default:
                break;
        }
        index++;
    }
    string finalZnWord = string.Join("", rawZnWordList.ToArray()); 
    outputTextBox.Text = finalZnWord;
}

于 2013-03-31T04:25:55.210 回答
0

我认为这做同样的事情并且更具可读性。当然用你自己的值替换字母环。我只去了5个字符。我猜你会想要更多。

//replacement letter rings
char[][] aRep = { 
    "xfhygaodsekzcpubitlvnjqmrw".ToCharArray(),
    "wqtnsepkbalmzyxvordhjgifcu".ToCharArray(),
    "nyxgmcibplovkwrszaehftqjud".ToCharArray(),
    "soqjhpybuwfxvartkzginemdcl".ToCharArray(),
    "pldquhegkaomcnjrfxiysvtbwz".ToCharArray(),
};
private string newText(string inVal)
{
    char[] ia = inVal.ToCharArray(); //in array
    int l = ia.Length;
    char[] oa = new char[l]; //out array
    for (int i = 0; i < l; i++)
        oa[i] = aRep[i][(int)ia[i]-97]; //lowercase starts at char97
    return new string(oa);
}

这也是我用来生成戒指的代码:

//generate random letter rings
//char[] ascii = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
//for (int i = 0; i < 8; i++)
//  new string(ascii.OrderBy (x => Guid.NewGuid() ).ToArray()).Dump();

我做了一些非常简单的测试,这似乎比原来的方法快了很多,更重要的是(对我来说)它更具可读性并且更容易看到你的替换字母序列。我认为还有一些优化要做,但我认为这是一个好的开始。只需在“更改时”期间用您的文字调用它。

于 2013-03-31T06:25:00.060 回答