【发布时间】:2022-01-13 23:32:35
【问题描述】:
我在数据网格中显示数据,并希望使用范围滑块(带两个手柄的滑块)过滤数据。范围滑块的 change-event 只设置字符串变量filterTrigger。过滤器本身是通过 mouseup 事件触发的。
private void ApplyFilter()
{
if (filterTrigger != "")
{
filteredData.Clear();
suitableData.ForEach((item) =>
{
filteredData.Add(item); // create not referenced copy of list suitableData that was created in time consuming calculations
});
switch (filterTrigger)
{
case "foo":
// remove too small and too large Foos
_ = filteredData.RemoveAll(x => x.Foo > fooRangeSliderHandlesMinMax.ElementAt(1) || x.Foo < fooRangeSliderHandlesMinMax.ElementAt(0));
// set new minimum and maximum of range of range slider
barRangeSliderMinimum = filteredData.Min(x => x.Bar) - 0.1;
barRangeSliderMaximum = filteredData.Max(x => x.Bar) + 0.1;
// set new position of range slider handles
barRangeSliderHandlesMinMax = new double[2] { Math.Max(barRangeSliderHandlesMinMax.ElementAt(0), barRangeSliderMinimum + 0.1), Math.Min(barRangeSliderHandlesMinMax.ElementAt(1), barRangeSliderMaximum - 0.1) };
break;
case "bar":
_ = filteredData.RemoveAll(x => x.Bar > barRangeSliderHandlesMinMax.ElementAt(1) || x.Bar < barRangeSliderHandlesMinMax.ElementAt(0));
fooRangeSliderMinimum = filteredData.Min(x => x.Foo) - 0.1;
fooRangeSliderMaximum = filteredData.Max(x => x.Foo) + 0.1;
fooRangeSliderHandlesMinMax = new double[2] { Math.Max(fooRangeSliderHandlesMinMax.ElementAt(0), fooRangeSliderMinimum + 0.1), Math.Min(fooRangeSliderHandlesMinMax.ElementAt(1), fooRangeSliderMaximum - 0.1) };
break;
default:
break;
}
// remove values of foo if filterTrigger was "bar" and vice versa
_ = filteredData.RemoveAll(x => x.Foo > fooRangeSliderHandlesMinMax.ElementAt(1) || x.Foo < fooRangeSliderHandlesMinMax.ElementAt(0) || x.Bar > barRangeSliderHandlesMinMax.ElementAt(1) || x.Bar < barRangeSliderHandlesMinMax.ElementAt(0));
// update data grid data
IFilteredData = filteredData;
dataGrid.Reload();
filterTrigger = "";
}
}
当我注释掉所有以丢弃 _ 开头的行时,代码运行流畅。但当然,我需要这些线条。问题是,它们需要大量的处理器能力。它仍在工作,但是当我点击过滤器的手柄移动鼠标时,手柄非常滞后(我的笔记本电脑听起来像直升机)。
我知道最后一个过滤器的一部分是多余的,因为当 filterTrigger 为 foo 时, foo 已经被过滤了。但是只过滤之前没有过滤的,并不能单独解决问题,因为上面我只展示了两个过滤器,但实际上大约有十个过滤器。
那么,有没有办法优化这段代码?
【问题讨论】:
-
为什么要先将所有数据添加到
filteredData,然后再进行修剪?只承认你确实想要的项目会更有意义 -
你在
filteredData有多少项目? -
@MathiasR.Jessen:问得好。那不是很聪明。我添加了一个 if 条件来检查是否将
item添加到filteredData并删除了整个RemoveAll部分。感谢您的出色提示。 -
@Chetan:
suitableData有 400 个项目,filteredData有 0 到 400 个项目。这并不多,但每个项目都有大约 30 个属性,例如item.Foo和item.Bar。
标签: c# optimization