【问题标题】:C# LINQ Lambda multiple group of IEnumerable with Sum()C# LINQ Lambda 多组 IEnumerable 与 Sum()
【发布时间】:2015-06-15 09:36:43
【问题描述】:

我有一个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"

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

谢谢。

【问题讨论】:

    标签: c# .net linq collections lambda


    【解决方案1】:

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

    事实证明,我错过了您可以为GroupBy 方法as explained in the MSDN documentation 提供键选择器和元素选择器的事实。如果我理解正确,这提供了具有不同限定符的能力,该限定符告诉查询如何分组。

    最后,这似乎给了我我需要的东西。我真的很想得到一些反馈,以确保我正确地处理它:

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

    【讨论】:

      【解决方案2】:

      试试这样的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多