当前位置:  开发笔记 > 编程语言 > 正文

C#为什么这个循环这么慢?

如何解决《C#为什么这个循环这么慢?》经验,为你挑选了1个好方法。

我继承了一些将过滤器应用于数据网格的代码,当数据网格中有超过500行(它挂起超过500,工作正常,有100行)时,过滤器适用但速度非常慢,过滤器基本上说"显示"我支付"或"的每个人都向我展示X国的每个人"等等.

将立即创建与过滤器匹配的行列表(下面的filteredRows).

        if (comboBoxFilterCondition.Text == "Contains")
        {
            strSearchFilter += string.IsNullOrEmpty(txtFilterValue.Text) ? " IS NULL" : " LIKE '%" + txtFilterValue.Text + "%'";
        }

        FilterRows(strSearchFilter);

// ....

    private void FilterRows(string strSearchFilter)
    {
            DataTable table = dataGridView1.DataSource as DataTable;
            if (table != null)
            {
                List filteredRows = new List(table.Select(strSearchFilter)); //<----Very quick to here

                CurrencyManager cm = (CurrencyManager)BindingContext[dataGridView1.DataSource];
                cm.SuspendBinding();
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    row.Visible = filteredRows.Contains(((DataRowView)row.DataBoundItem).Row); //<---Stuck here
                }
                cm.ResumeBinding(); //<----------Doesn't arrive here

// .....

有任何想法吗?谢谢大家



1> BFree..:

没有理由自己进行过滤.如果datagridview绑定到DataTable(似乎它是),只需使用DataTable.DefaultView.RowFilter属性.来样......

好的,我创建了一个带有DataGridView和两个按钮的简单表单.在第一个按钮上单击它会应用一个数据表,在第二个按钮上它会过滤它:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DataTable table = new DataTable();
        table.Columns.Add("Name", typeof(string));
        table.Columns.Add("Age", typeof(int));
        table.Rows.Add("John", 25);
        table.Rows.Add("Jack", 34);
        table.Rows.Add("Mike", 17);
        table.Rows.Add("Mark", 54);
        table.Rows.Add("Frank", 37);

        this.dataGridView1.DataSource = table;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        var table = this.dataGridView1.DataSource as DataTable;
        table.DefaultView.RowFilter = "Age > 30";

    }

单击第二个按钮时,网格将自动过滤.这应该比自己手动操作更快.看看我之前向您展示的那个链接,以及这个链接:http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx有关构建过滤器的更多信息表达.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有