c# - order by then count 和 select Max by group,性能问题

标签 c# .net linq

我尝试按列表进行分组,然后计算每组中的项目数,然后根据计数仅选择每组的最大值。以下代码有效并且完全符合我的需要。问题是它很慢,尤其是第二步。您知道以更有效的方式实现相同结果的方法吗?

var grouppedList = sourceList.Where(j => j.field1 == "1000")
    .GroupBy(i => new { mask = i.field2.Substring(0, 1), f3 = i.field3, f4 = i.field4 })
    .Select(k => new
    {
        f4 = k.Key.f4,
        mask = k.Key.mask,
        f3 = k.Key.f3,
        Total = k.Count()
    });

var totalsList = grouppedList
    .Where(i => !grouppedList.Any(j => 
                       j.mask == i.mask && j.f4 == i.f4 && j.Total > i.Total))
    .ToList();

最佳答案

您的groupedList 不是List。它是一个 IEnumerable。所以每次访问它时都会执行它。您可以访问它的每个部分(在 Where 子句中)。我建议从中创建一个列表(只执行一次查询):

var grouppedList = sourceList.Where(j => j.field1 == "1000")
    .GroupBy(i => new { mask = i.field2.Substring(0, 1), f3 = i.field3, f4 = i.field4 })
    .Select(k => new
    {
        f4 = k.Key.f4,
        mask = k.Key.mask,
        f3 = k.Key.f3,
        Total = k.Count()
    }).ToList();

另一种可能性是将分组和获取总计最多的项目结合起来,我会这样做:

var grouppedList = sourceList.Where(j => j.field1 == "1000")
.GroupBy(i => new { mask = i.field2.Substring(0, 1), f3 = i.field3, f4 = i.field4 })
.Select(k => new
{
    f4 = k.Key.f4,
    mask = k.Key.mask,
    f3 = k.Key.f3,
    Total = k.Count()
})
.GroupBy(x => new {x.mask, x.f4})
.Select(x=>x.OrderBydescending(t=>t.Total).First());
.ToList();

关于c# - order by then count 和 select Max by group,性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41933218/

相关文章:

c# - Moq 对象总是返回 null ,为什么?

c# - 是否有用于 C# 的 DataBinder.Eval 的快速版本?

.net - 如何在验证之前访问 NumericUpDown 控件的文本?

.net - 什么会导致程序集构建版本和运行时版本不同?

linq - 如何使用动态字符串参数执行 OrderBy?

c# - X文档遍历

c# - 如何过滤 Telerik 的 RadGrid 的 GridTemplateColumns

C# List<T> 内存不足异常但远离 2Gb 限制

c# - .net 以横向表示形式打印 HTML 文档

C# 动态 Linq : Implement "Like" in The Where Clause