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