C#-自定义分组,用于大型数据集需要更多时间

C#-自定义分组,用于大型数据集需要更多时间,c#,.net-core,C#,.net Core,下面的代码将结果(包含500000项的ClassTypeObject列表)分组为列表类型 GroupBy执行时大约需要40到50秒。有没有办法优化这个 var groupByTest = result. GroupBy(g => new { First = g.Field1 }). Select(gp => new

下面的代码将结果(包含500000项的ClassTypeObject列表)分组为列表类型

GroupBy执行时大约需要40到50秒。有没有办法优化这个

var groupByTest = result.
                GroupBy(g => new
                {
                    First = g.Field1
                }).
                Select(gp => new
                {
                    gp.Key.Field1,
                    InnerList = result.Where(x => x.Field1 == gp.Key.Field1).ToList()
                }).ToList();

您正在从非分组集合中选择
InnerList
,即
result
,这就是您的查询需要花费时间的原因。您可以根据需要更改内部查询分配

InnerList = gp.ToList()
as
gp
已根据
Field1
进行分组

完整代码

   var groupByTest = result.
            GroupBy(g => new
            {
                First = g.Field1
            }).
            Select(gp => new
            {
                gp.Key.Field1,
                InnerList = gp.ToList()
            }).ToList();

此查询的编写方式
InnerList
最终只包含组中的项。在其当前形式中,对每个组密钥扫描一次原始源。等价物:

var groupByTest = result.GroupBy(g => g.Field1)
                         .Select(gp => new {
                                        Field1=gp.Key,
                                        InnerList = gp.ToList()})
                          .ToList();
将只扫描源一次

一旦解决了这个问题,查询就可以轻松地与
aspallel()并行


这将使用机器中的所有内核对数据进行分区、分组并构建最终列表

如果注释掉
InnerList=result.Where(x=>x.Field1==gp.Key.Field1).ToList()需要多长时间
line?为什么要从未分组的集合中选择
InnerList
,即
result
,您可以将内部查询更改为
InnerList=gp.ToList()
,因为数据已经基于
Field1
进行分组。如果它是从数据库提供的,那么分组字段上是否有索引?
var groupByTest = result.AsParallel()
                        .GroupBy(g => g.Field1)
                        .Select(gp => new {
                                        Field1=gp.Key,
                                        InnerList = gp.ToList()})
                         .ToList();