-1

我正在对集合进行一些繁重的过滤(这只不过是“数据线”条目的封装列表)。我需要在 3 个字段(日期(字符串)、路线(字符串)和 ConsolidationCode(字符串))上“合并”这些行。

提取 3 个不同的列表工作得很快。我更担心三重foreach...我会说正常的“完整_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);
    }
4

2 回答 2

2

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

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

您的代码将所有数据迭代3 次以获得不同的字段。然后它为不同字段的所有组合迭代所有数据(当您使用 where 子句进行过滤时)。通过这三个字段分组,您将只迭代一次数据。每个结果组将至少有一个项目,因此您无需在调用过滤器之前检查组中是否有任何项目。

于 2013-04-02T07:02:28.390 回答
0

看起来您正在尝试获取日期、路线和合并的每一个不同的组合。

您当前的代码很慢,因为我认为它是 O(n^4)。您有三个嵌套循环,其主体是线性搜索。

通过使用 Distinct 的重载,您可以获得更好的性能IEqualityComparer<T>

http://msdn.microsoft.com/en-us/library/bb338049.aspx

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

该类的DealerCaseComparer实现方式与上述 MSDN 链接中的实现方式非常相似。

于 2013-04-02T07:02:17.200 回答