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);
    }

c# LINQ -我能在这里做些什么来提高性能?

看起来您需要按三个字段分组:

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>:

的Distinct重载来获得更好的性能。http://msdn.microsoft.com/en-us/library/bb338049.aspx

var Consolidated = 
  _DealerCaseSetComplete.Data.Select(rec => rec).
  Distinct(new DealerCaseComparer());

DealerCaseComparer的实现与上面的MSDN链接非常相似。

相关文章: