简单首字母缩略词生成器中的逻辑错误

时间:2013-09-19 14:49:04

标签: c#

我的程序中存在某种逻辑错误。每当我输入一个带有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];
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

Substring(0, 0)毫无意义。这将始终是一个空字符串。

Substring(len, len)也是一个坏主意,因为它将从索引len开始返回长度为len的字符串。这是你获得例外的地方。

我假设,在两种情况下,你真正想要的是第二个参数为1。这可以通过索引进一步简化为访问:

d[x].ToUpper()[0] == var.ToUpper()[len]

答案 1 :(得分:0)

使用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方法。改为使用索引器。

答案 2 :(得分:0)

这一行解释了这种行为。

if (d[x].ToUpper().Substring(0, 0) == var.ToUpper().Substring(len, len))

子串的第二个参数是字符串长度。所以在左边你总是有一个空字符串。在右边,当len == 0时你也有空字符串(这就是为什么你的代码总是选择Apple)。

之后你改变len,并重复循环。然后右边的表达式是var.Substring(1,1),如果你的字符串是1个字符长,它会给你错误。因为这读取 - 1符号以1开头(这是字符串的第二个字符)

除此之外,代码的目的是完全神秘的,所以肯定存在其他错误。