C# 按订单,然后计数并选择“按组最大值”、“性能问题”
我正在尝试按列表分组,然后对每个组中的项目进行计数,然后根据其计数仅选择每个组的最大值。下面的代码工作正常,完全符合我的需要。问题是它非常慢,尤其是第二步。你知道一种更有效的方法来达到同样的效果吗?C# 按订单,然后计数并选择“按组最大值”、“性能问题”,c#,.net,linq,C#,.net,Linq,我正在尝试按列表分组,然后对每个组中的项目进行计数,然后根据其计数仅选择每个组的最大值。下面的代码工作正常,完全符合我的需要。问题是它非常慢,尤其是第二步。你知道一种更有效的方法来达到同样的效果吗? 您的groupedList不是列表。它是一个IEnumerable。因此,每次访问它时都会执行它。您可以访问它的每个部分(在Where子句中)。我建议从中创建一个列表(只执行一次查询): 另一种可能是将分组和获取项目与最大总数结合起来,我会这样做: var grouppedList = sourc
您的
groupedList
不是列表
。它是一个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()
})
.GroupBy(x => new {x.mask, x.f4})
.Select(x=>x.OrderBydescending(t=>t.Total).First());
.ToList();
这段代码看起来很慢的原因可能是您迭代了两次
grouppedList
var totalsList = grouppedList.Where(i => !grouppedList.Any(
j => j.mask == i.mask && j.f4 == i.f4 && j.Total > i.Total)
).ToList();
将在内部的Where
-语句中对groppedList
中的所有元素迭代groppedList
。您可以考虑强制使用<代码> Toistist立即执行:
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(); // this forces an immediate execution of your select-statement
当你现在调用你的第二个语句
var totalsList = grouppedList.Where(i => !grouppedList.Any(j => j.mask == i.mask && j.f4 == i.f4 && j.Total > i.Total)).ToList();
它将使用allready物化列表,而不是一次又一次地执行查询。您是否尝试在第一部分创建列表,以便只进行一次计数?第二步是什么?只有一个查询,它将在
ToList
执行,谢谢Tim!这正是问题所在。@Manngo如果它对你有帮助,我会感谢你的支持:)我肯定会使用第二种方法(或类似方法)+1
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(); // this forces an immediate execution of your select-statement
var totalsList = grouppedList.Where(i => !grouppedList.Any(j => j.mask == i.mask && j.f4 == i.f4 && j.Total > i.Total)).ToList();