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