使用listview和streamreader进行简单的“实时”搜索

时间:2012-12-12 12:52:22

标签: c#

我正在尝试使用streamreader进行简单的实时搜索,从txt文件中读取并在listview中搜索并显示结果,问题是我只能搜索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}

2 个答案:

答案 0 :(得分:1)

这很简单。当您从流读取器读取的行,并且您将值拆分并存储在xd中时,将始终显示此错误。假设xd的长度是n。你输入的sokord字符串说长度。现在你写的时候: (xd[i].Substring(0, sökord.Length) 只要n的xd的长度小于m,子串函数就会尝试从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;
    }

Digvijay

PS:说实话,我已经从最能理解的内容中找到了答案,所以在一个场景中代码可能有点偏离。但无论如何,我上面描述的错误是100%正确的。因此,如果你只是调查并跟踪轨道,那将是最好的。 =)

答案 1 :(得分: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;
    }