Помочь уменьшить петли с кодом фильтра


Следующий код работает очень медленно. Мне было интересно, если вы можете помочь мне ускорить его.

private void filter(List<CheckBox> boxList)
        {
            // refLanguageTabs is a TabControl the Tabcount is 9
            for (int i = 0; i < refLanguageTabs.TabCount; i++)
            {
                Control[] ctrls = refLanguageTabs.TabPages[i].Controls.Find(refLanguageTabs.TabPages[i].Name + "Grid", true);
                DataGridView dgv = ctrls[0] as DataGridView;

                // average row count is 3000 
                for (int j = 0; j < dgv.RowCount; j++)
                {
                    for (int k = 0; k < boxList.Count; k++)
                    {
                        if (dgv.Rows[j].Cells[1].Value.ToString() != boxList[k].Name.ToString())
                        {
                            dgv.Rows[j].Visible = false;
                        }
                    }
                }
                dgv.Refresh();
            }
        }


873
2
c#
задан 19 декабря 2011 в 03:12 Источник Поделиться
Комментарии
3 ответа

Несколько мыслей без проверки или что-нибудь еще:

foreach(DataGridViewRow row in dgv.Rows)
{
String cellValue = row.Cells[1].Value.ToString();
foreach(CheckBox boxItem in boxList)
{
if(cellValue == boxItem.Name)
{
row.Visible = false;
break;
}
}
}

По другому выскажусь, пожалуйста, используйте осмысленные имена переменных, даже в таких тупых итерации циклов.

5
ответ дан 19 декабря 2011 в 03:12 Источник Поделиться

Моя рекомендация будет сначала сделать один проход через элементы и заполнить словарь, в котором ключом является имя и значение самой клетки. Затем сделать один проход через флажки, и для каждого флажок Использовать его имя для поиска ячейки в словарь и там Вы имеете его.

1
ответ дан 19 декабря 2011 в 04:12 Источник Поделиться

Если вы можете стоять немного скрытые, это может немного увеличить:

    private void filter(IEnumerable<CheckBox> boxList)
{
// refLanguageTabs is a TabControl the Tabcount is 9
for (var i = 0; i < refLanguageTabs.TabCount; i++)
{
var ctrls = refLanguageTabs.TabPages[i].Controls.Find(refLanguageTabs.TabPages[i].Name + "Grid", true);
var dgv = ctrls.Any() ? ctrls[0] as DataGridView : null;

if (dgv == null)
{
continue;
}

// average row count is 3000
Parallel.For(0, dgv.RowCount, j =>
{
foreach (var t in boxList.Where(t => dgv.Rows[j].Cells[1].Value.ToString() != t.Name.ToString()))
{
dgv.BeginInvoke(new MethodInvoker(() => { dgv.Rows[j].Visible = false; }));
}
});

dgv.Refresh();
}
}

1
ответ дан 19 декабря 2011 в 04:12 Источник Поделиться