带有Sum()的C#LINQ Lambda多组IEnumerable

本文关键字:Lambda 多组 IEnumerable C#LINQ Sum 带有 | 更新日期: 2025-05-08 12:19:18

我有一个data = IEnumerable<AnalyticsData>的集合,我正试图通过整数列上的多个属性和Sum()进行分组。最终结果将是AnalyticsReportRow<dynamic>()的集合,正如您在下面看到的,尽管这并不是高度相关的。

在最后的Select()方法中,我希望传入一个对象,最好是从原始集合传入,如果可能的话,我不希望在我的链式查询中间重新创建一个对象。大多数示例似乎都创建了一个新的强类型或动态对象,以传递到链中的下一个链接。

以下是我花了几个小时试图处理的内容,这将返回下面第一个代码块中的所有行的集合(我导出为CSV,因此格式化):

var pageViewsData = analyticsData.GroupBy(data => new { g1 = data.Webproperty, pv = data.PageViews, d = data })
    .GroupBy(data => new { gg1 = data.Key.g1, dd = data.Key.d })
    .Select(data => new AnalyticsReportRow<dynamic>(data.Key.dd, "Page_Views", data.Sum(datas => datas.Key.pv)));

结果是:

"CustomerA","","","","","Page_Views",0,"A1-810","","",2,"4/10/2015 16:08:33"
"CustomerA","","","","","Page_Views",0,"A1-810","","",2,"4/10/2015 16:08:33"
"CustomerA","","","","","Page_Views",0,"GT-N8013","","",2,"4/10/2015 16:08:33"
"CustomerA","","","","","Page_Views",0,"GT-P3113","","",7,"4/10/2015 16:08:33"
"CustomerA","","","","","Page_Views",0,"GT-P3113","","",2,"4/10/2015 16:08:33"
"CustomerA","","","","","Page_Views",0,"GT-P3113","","",3,"4/10/2015 16:08:33"
"CustomerA","","","","","Page_Views",0,"GT-P3113","","",3,"4/10/2015 16:08:33"
"CustomerA","","","","","Page_Views",0,"GT-P3113","","",2,"4/10/2015 16:08:33"

并且希望在倒数第二列显示Sum(),按客户分组,然后按设备分组。例如:

"CustomerA","","","","","Page_Views",0,"A1-810","","",4,"4/10/2015 16:08:33"
"CustomerA","","","","","Page_Views",0,"GT-N8013","","",2,"4/10/2015 16:08:33"
"CustomerA","","","","","Page_Views",0,"GT-P3113","","",16,"4/10/2015 16:08:33"

我很难理解逻辑,我真的可以用一个例子来说明如何像这样分组,甚至是伪代码和动态类型。

谢谢。

带有Sum()的C#LINQ Lambda多组IEnumerable

今天花了几个小时讨论这个问题并发布了我的问题后,我决定尝试更多的东西,并阅读更多关于GroupBy()的文档。

事实证明,我忽略了这样一个事实,即您可以为GroupBy方法提供一个键选择器和一个元素选择器,如MSDN文档中所述。如果我理解正确的话,这提供了一个不同的限定符的能力,该限定符告诉查询如何分组。

最后,这似乎给了我所需要的。我真的很想得到一些反馈,以确保我做得正确:

var pageViewsData = analyticsData.Where(data => data.PageViews > 0)
  .GroupBy(data => new { g1 = data.Webproperty, g2 = data.DeviceModel }, data => data)
  .Select(data => new AnalyticsReportRow<dynamic>(data.FirstOrDefault(), "Page_Views", data.Sum(d => d.PageViews)));

试试这样的东西:

var query = from d in analyticsData
            group d by new { d.Webproperty, d.DeviceModel }
            into g
            select new 
            {
                g.Webproperty,
                g.DeviceModel,
                Total = g.Sum(it => it.PageViews)
            };
var result = query.ToList();