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

C# 简单首字母缩略词生成器中的逻辑错误,c#,C#,我的程序中有某种逻辑错误。每当我输入一个有1个字母的短语时,我就会得到ArgumentOutOfRange异常,每当我输入多个字母的单词时,文本框就会清除,显示“Apple”(数组中的第一个值),而不执行其他操作。有人能看出其中的逻辑错误吗 string[] d = { "Apple", "Bass", "Cat", "Dog", "Ear", "Flamingo", "Gear", "Hat", "Infidel", "Jackrabbit", "Kangaroo", "Lathargic",

我的程序中有某种逻辑错误。每当我输入一个有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];
            }
        }
    }
}
string[]d={“苹果”、“贝斯”、“猫”、“狗”、“耳朵”、“火烈鸟”、“齿轮”、“帽子”、“异教徒”、“大野兔”、“袋鼠”、“拉塔吉奇”、“猴子”、“裸体”、“奥兹曼蒂斯”、“蟒蛇”、“女王”、“老鼠”、“讽刺”、“东斯敦”、“尿”、“弗吉尼亚”、“羊毛”、“木琴”、“溜溜球”、“斑马”、“斑马”};
字符串变量;
int len=0;
私有无效按钮1\u单击(对象发送者,事件参数e)
{
var=textBox2.Text;
textBox1.Text=“”;
对于(int y=0;y
子字符串(0,0)
实际上毫无意义。这将始终是一个空字符串

子字符串(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];
        }
    }
}
for(int y=0;y
变化如下:

  • 您不需要
    len
    变量。改用
    y
  • 您不需要整个
    字符串
    大写。改用
    char.ToUpper
    静态方法
  • 您不需要
    string.Substring
    方法。改用索引器

这一行解释了这种行为

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

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


除此之外,代码的用途是完全神秘的,因此肯定还有其他错误

我删除了不相关的代码。您应该始终只发布与问题相关的部分。通过调试代码,您会发现很多难闻的事情。在按钮1中放置一个断点,然后单击,您将发现它。啊,谢谢。我在C语言方面相当缺乏经验,并且是利用我在其他语言方面的知识来做这件事的。我不知道你可以这样索引字符串。谢谢你的帮助。