c# LINQ -我能在这里做些什么来提高性能?
本文关键字:高性能 做些什么 在这里 LINQ | 更新日期: 2023-09-27 18:06:53
我正在对一个集合(它只不过是一个"datalines"条目的封装列表)进行一些繁重的过滤。我需要在3个字段上"合并"这些行(日期(字符串),路由(字符串)和ConsolidationCode(字符串))。
提取3个不同的列表工作速度很快。我更担心的是三连冠……我会说一个正常的"complete _DealerCaseSetComplete"包含5000个条目。日期约为5,路线约为100,合并约为350-500。
我写了下面的方法。它完全做了我想要它做的,但是在计算时间上很慢。
如果您需要任何其他代码(实际上非常简单),请询问。
private void FillDataGridView()
{
//
_LocalGridControl.Invoke(CreateDataGrid);
//Filter by Date
List<string> Dates = _DealerCaseSetComplete.Data.Select(rec => rec.DateAdded).Distinct().ToList();
//Filter by Route
List<string> Routes = _DealerCaseSetComplete.Data.Select(rec => rec.Route).Distinct().ToList();
//Filter by Consolidation
List<string> Consolidations = _DealerCaseSetComplete.Data.Select(rec => rec.DealerConsolidationCode).Distinct().ToList();
foreach(string d in Dates)
{
foreach(string r in Routes)
{
foreach(string c in Consolidations)
{
List<DealerCaseLine> Filter = _DealerCaseSetComplete.Data.Where(rec => rec.DateAdded == d &&
rec.Route == r &&
rec.DealerConsolidationCode == c).ToList();
if(Filter.Count > 0)
_LocalGridControl.Invoke(AddLineToDataGrid, Filter);
}
}
}
_LocalGridControl.Invoke(SortDataGrid);
}
看起来您需要按三个字段分组:
var filters = from r in _DealerCaseSetComplete.Data
group r by new {
r.DateAdded,
r.Route,
r.DealerConsolidationCode
} into g
select g.ToList();
foreach(List<DealerCaseLine> filter in filters)
_LocalGridControl.Invoke(AddLineToDataGrid, filter);
您的代码将所有数据迭代三次以获得不同的字段。然后,它为不同字段的所有组合迭代所有数据(当使用where子句进行过滤时)。通过按这三个字段分组,您将只迭代一次数据。每个结果组将至少有一个项,因此在调用过滤器之前,您不需要检查组中是否有任何项。
看起来你想要得到日期,路线和合并的每一个不同的组合。
你当前的代码很慢,因为我认为它是O(n^4)。你有三个嵌套循环,循环体是一个线性搜索。
您可以通过使用带有IEqualityComparer<T>
:
var Consolidated =
_DealerCaseSetComplete.Data.Select(rec => rec).
Distinct(new DealerCaseComparer());
类DealerCaseComparer
的实现与上面的MSDN链接非常相似。