简单首字母缩略词生成器中的逻辑错误
本文关键字:错误 缩略词 简单 | 更新日期: 2023-09-27 18:32:11
我的程序中有某种逻辑错误。每当我输入一个带有 1 个字母的短语时,我都会得到一个 ArgumentOutOfRange 异常,每当我输入一个多字母单词时,文本框都会清除,显示"Apple"(数组中的第一个值),并且不执行任何其他操作。有人能看到其中的逻辑错误吗?
string[] d = { "Apple", "Bass", "Cat", "Dog", "Ear", "Flamingo", "Gear", "Hat", "Infidel", "Jackrabbit", "Kangaroo", "Lathargic", "Monkey", "Nude", "Ozzymandis", "Python", "Queen", "Rat", "Sarcastic", "Tungston", "Urine", "Virginia", "Wool", "Xylophone", "Yo-yo", "Zebra", " " };
string var;
int len = 0;
private void button1_Click(object sender, EventArgs e)
{
var = textBox2.Text;
textBox1.Text = "";
for (int y = 0; y < var.Length; y++)
{
for (int x = 0; x < d.Length; x++)
{
if (d[x].ToUpper().Substring(0, 0) == var.ToUpper().Substring(len, len))
{
len = len + 1;
textBox1.Text = textBox1.Text + "'n" + d[x];
}
}
}
}
>Substring(0, 0)
真的毫无意义。这将始终是一个空字符串。
Substring(len, len)
也是一个坏主意,因为它将返回从索引 len
开始的长度字符串len
。这是您获得异常的地方。
我假设,您真正想要的是两种情况下的第二个参数都是 1。这可以进一步简化为通过索引访问:
d[x].ToUpper()[0] == var.ToUpper()[len]
使用 LINQ 可以非常轻松地执行相同的操作:
private void button1_Click(object sender, EventArgs e)
{
var dict = d.ToDictionary(x => x.First(), x => x);
textBox1.Text = string.Join(Environment.NewLine, textBox2.Text.Select(x => dict[char.ToUpper(x)]));
}
要在没有 LINQ 的情况下执行此操作,我建议如下:
for (int y = 0; y < input.Length; y++)
{
for (int x = 0; x < d.Length; x++)
{
if (char.ToUpper(d[x][0]) == char.ToUpper(input[y]))
{
result = result + "'n" + d[x];
}
}
}
更改包括:
- 您不需要
len
变量。请改用y
。 - 您不需要整个大写
string
。请改用char.ToUpper
静态方法。 - 您不需要
string.Substring
方法。请改用索引器。
这一行解释了行为。
if (d[x].ToUpper().Substring(0, 0) == var.ToUpper().Substring(len, len))
子字符串的第二个参数是字符串长度。所以在左边你总是有一个空字符串。在右侧,当len==0时,你也有空字符串(这就是为什么你的代码总是选择Apple)。
之后,您更改 len,并重复循环。那么右边的表达式是var。子字符串(1,1),如果您的字符串长度为 1 个字符,则会出错。因为这读 - 1 以 1 开头的符号(这是字符串的第二个字符)
除此之外,代码的目的完全是神秘的,所以肯定还有其他错误。