Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按订单,然后计数并选择“按组最大值”、“性能问题”_C#_.net_Linq - Fatal编程技术网

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();