我真的不善于解释,但我会尽我所能。
我正在做一个小程序,可以在你打字的时候把一个单词转换成另一个单词。输入的每个字母都会经过这段代码,根据其在整个单词中的索引位置,它将更改为不同的字母。
我这里的问题是,当有重复的字母时,重复的字母不会根据它们在单词中的位置而变化,而是第一个出现的字母。
例如,这是由单词"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;
}发布于 2013-03-31 12:29:21
您应该尝试使用for循环,如下所示:
for (int i = 0; i < inputTextBox.Text.Length; i++)
{
char a = inputTextBox.Text[i];
switch (i)
{
case 0:
switch (a)
...希望这能有所帮助;)。
发布于 2013-03-31 14:25:00
我认为这是做同样的事情,并且更具可读性。当然,将字母环替换为您自己的值。我只写了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();我做了一些非常简单的测试,这似乎比原来的方法要快得多,更重要的是(对我来说)它的可读性更好,更容易看到你的替换字母序列。我认为还有更多的优化要做,但我认为这是一个很好的开始。在“on change”期间用你的文本调用它。
https://stackoverflow.com/questions/15726235
复制相似问题