2013-08-28 33 views
1

我有包含学生的详细信息(姓氏,姓名,性别,学历和刻录日期)一个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只是直到删除字符用户按下最后一个搜索结果的另一个列表,但它不是那么帮助,它的成本记忆......

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

谢谢

回答

1

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

+0

谢谢!我明白你的观点,无论如何,如果你有任何例子的链接,我会很高兴。 – AsfK

0

您应该先测量需要花费的时间。它是搜索本身(我怀疑)还是刷新每个按键上的数据网格?

+0

搜索花了时间 – AsfK