0

我正在尝试使用流式阅读器进行简单的实时搜索,以读取 txt 文件并在列表视图中搜索并显示结果,问题是我只能搜索 1 个字母,因此搜索“1”将显示结果以 1 开头的所有内容,例如搜索 1 的结果为“123”,但搜索“12”或“123”不会显示相同的结果。用我试过的这段代码更容易解​​释。

编辑,我正在读取的文本文件具有以下结构: 123;asd;asd;asd;asd;asd;asd <- 行示例

    public static string[] testtt(string sökord)
    {
        StreamReader asd = new StreamReader("film.txt");
        string temp;
        string[] xd;

        while (asd.Peek() >= 0) // if I can read another row (I.E next row isnt empty)
        {
            temp = asd.ReadLine();
            xd = temp.Split(';');

            for (int i = 0; i < xd.Length; i++)
            {
                // this should check if my searchword is equal to any member of "xd"
                // but this is where the problem occurs when the input is more than 1
                // character, will post error message from debugger below this code.
                if (xd[i].Substring(0, sökord.Length).ToLower() == sökord.ToLower())
                    return xd;
            }
        }

        return null;
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        try
        {
            listView1.Items.Clear();
            ListViewItem item = new ListViewItem(testtt(textBox1.Text)[0]);
            item.SubItems.Add(testtt(textBox1.Text)[1]);
            item.SubItems.Add(testtt(textBox1.Text)[2]);
            item.SubItems.Add(testtt(textBox1.Text)[3]);
            item.SubItems.Add(testtt(textBox1.Text)[4]);
            item.SubItems.Add(testtt(textBox1.Text)[5]);
            item.SubItems.Add(testtt(textBox1.Text)[6]);
            listView1.Items.Add(item);

            if (textBox1.Text == "")
                listView1.Items.Clear();
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message);
        }
    }

前任

{"Index and length must refer to a location within the string.\r\nParameter name: length"} System.Exception {System.ArgumentOutOfRangeException}
4

2 回答 2

1

这相当简单。当您从流阅读器读取的行并且您将值拆分并存储在 xd 中时,此错误将始终出现。假设 xd 的长度为 n。您输入的 sokord 字符串的长度为 m。现在,当您编写时: (xd[i].Substring(0, sökord.Length) 只要 xd 的长度 n 小于 m,Substring 函数就会尝试仅从 n 个字母生成 m 个字母的子串。因此它给出了你提到的错误。

无论如何,只需一个简单的检查就可以了:

    String sString = null;
    if(xd[i].length>=sokord.length){
        sString = xd[i].SubString(0,sokord.length).toLower();
        if(sString.equals(sokord.toLower()))
            return xd;
    }

迪格维杰

PS:老实说,我已经根据我所能理解的最佳内容编写了答案,因此在一种情况下代码可能有点偏离轨道。但无论如何,我上面描述的错误是 100% 正确的。因此,如果您只是调查一下并遵循轨道,那将是最好的。=)

于 2012-12-12T13:11:26.347 回答
0

仍然不知道我是否正确理解了这个问题,但这不会更容易阅读和理解吗?

    private String[] FindSome(String searchword)
    { 
        foreach (String s in System.IO.File.ReadLines("myfile.txt"))
        {
            String[] tmp = s.Split('c');
            foreach (String t in tmp)
            {
                if (t.StartsWith(searchword,StringComparison.CurrentCultureIgnoreCase)) return tmp;
            }
        }
        return null;
    }
于 2012-12-12T13:21:03.597 回答