提高linq构建的树数据结构的性能

时间:2015-06-10 08:41:59

标签: c# performance linq

我正在为汽车制造商,型号和引擎等的月度​​体积数据的相关集合创建4或5级的树形数据结构。尽管需要花费一分钟来构建它。有没有更快的方法呢?

var carData = (from manufacturer in manufacturerMonths.Select(m => m.Manufacturer).Distinct()
                  select new
                  {
                      ManufacturerData = (from manufacturerMonth in manufacturerMonths
                      .Where(t => t.Manufacturer == manufacturer)
                         select new
                         {
                            Date = manufacturerMonth.Date,
                            Volume = manufacturerMonth.Volume,
                            Models = new 
                            {
                               ModelsData = (from model in modelMonths
                               .Where(m => m.Manufacturer == manufacturer)
                               .Select(m => m.Model).Distinct()                                                                                                                                                             
                                  select new                                                                                                                                                              
                                  {
                                     ModelData = (from modelMonth in modelMonths
                                     .Where(m => m.Model == model)                                                                                            
                                        select new
                                        {
                                            Date = modelMonth.Date,
                                            Volume = modelMonth.Volume,
                                            Engines  = new       
                                            {
                                               EnginesData = (from engine in engineMonths
                                               .Where(e => e.Model == model)
                                               .Select(e => e.Engine).Distinct()
                                                  select new 
                                                  {
                                                     EngineData = ....
                                                  }
                                            }
                                        }
                                   }
                             }
                        }
                    }
               }

2 个答案:

答案 0 :(得分:1)

对每个外部语句项执行内部linq语句。它就像嵌套的foreach循环。因此,请确保不要反复处理相同的数据。使用词典时可能会提高性能:

E.g。 (只是为了表明我的意思,如果它错了就不要杀了我......)

而不是

                                           EnginesData = (from engine in engineMonths
                                           .Where(e => e.Model == model)
                                           .Select(e => e.Engine).Distinct()
                                              select new 
                                              {
                                                 EngineData = ....
                                              }

在开头创建一个字典:

Dictionary<Model, Engine[]> modelToEnginesDict = engineMonths
  .GroupBy(e => e.Model)
  .ToDictionary(
    x => x.Key,
    x => x.Select(e => e.Engine).Distinct().ToArray())

并在linq语句中使用它:

EnginesData = (from engine in modelToEnginesDict[model]
  select new 
  {
     EngineData = ....
  }

同时,您将大型查询拆分为较小的部分,对数据进行一些预处理。

答案 1 :(得分:0)

很多LINQ:O

恕我直言,尝试使用“拥有”继承的类层次结构。

LINQ是Lazy初始化的,并且会降低性能开销。 请参阅:Is a LINQ statement faster than a 'foreach' loop?

如果你可以编写自己的自定义代码来迭代List,你可以在某些情况下突破循环(如果你的设计真的可以实现)。这会有点痛苦,但在更长的时间内它会给你带来好处。

此外,代码将更容易调试,具有“新”(匿名)对象的LINQ深度很慢并且很难检查某些内容是否远离预期。