繁体   English   中英

如何在数据网格视图中提高搜索速度

[英]How to improve search speed in data grid view

我有一个datagridview,其中包含学生详细信息(名字,姓氏,性别,学位和燃烧日期)

我编写以下代码来执行“键盘搜索”(对于本示例,我在本地“加载”数据):

    public class StudentDetails
    {
        public string firstName;
        public string lastName;
        public string gender;
        public string degree;
        public DateTime burnDate;
    };

    public List<StudentDetails> studentSearchList = new List<StudentDetails>();    // Contain all dgv for searches

    private void Form1_Load(object sender, EventArgs e)
    {
        refreshDataGridView();
    }

    private void refreshDataGridView()
    {
        for (int i = 0; i < 1000; i++)
        {
            StudentDetails sd = new StudentDetails();
            sd.firstName = GetRandomFirstName();
            sd.lastName = GetRandomLastName();
            sd.gender = GetRandomGender();
            sd.degree = GetRandomDegree();
            sd.burnDate = GetRandomBurnDate();
            studentSearchList.Add(sd);
            addRowToDataGrid(sd);
        }
    }

    bool detailsContain(StudentDetails sd, string s)
    {
        if (sd.firstName.ToLower().Contains(s) ||
            sd.lastName.ToLower().Contains(s) ||
            sd.gender.ToLower().Contains(s) ||
            sd.degree.ToLower().Contains(s) ||
            sd.burnDate.ToShortDateString().ToString().Contains(s))
            return true;
        else
            return false;
    }

    void addRowToDataGrid(StudentDetails sd)
    {
        string[] row = new string[] { sd.firstName, sd.lastName, sd.gender, sd.degree, sd.burnDate.ToShortDateString().ToString() };
        dataGridView1.Rows.Add(row);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        List<StudentDetails> list_SD = new List<StudentDetails>();
        String s = textBox1.Text;
        s = s.ToLower().Trim();

        foreach (StudentDetails sd in studentSearchList)
            if (detailsContain(sd, s)) list_SD.Add(sd);

        // Clear old rows
        dataGridView1.Rows.Clear();
        dataGridView1.Refresh();

        // Adding the new rows
        foreach (StudentDetails sd in list_SD)
            addRowToDataGrid(sd);

    }

我的问题是搜索速度太慢,我不知道要提高速度。 我试图声明另一个包含所有数据库的列表,并用最后的搜索结果填充studentSearchList,直到用户按下Delete字符为止,但这并不是那么有用,并且需要花费大量的内存...

也许有人有好的搜索算法可以建议?

谢谢

您需要将记录“ StudentDetails”保留在数组中,而不是在列表中。 此后,为每个可搜索字段构建其他索引数组(无符号int或short),并根据适当字段的值对这些数组中的索引进行排序。 此后,您将只对每个必要字段使用二进制搜索,即log(N)。

您首先应该衡量所花费的时间。 是搜索本身(我怀疑)还是每次击键都刷新数据网格?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM