首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按不同分组聚合linq查询

问如何按不同分组聚合linq查询
EN

Stack Overflow用户
提问于 2019-06-13 22:25:35
回答 1查看 34关注 0票数 0

如何在linq中对不同的分组执行多个独立的聚合?

例如,我有一个表:

代码语言:javascript
复制
UNO     YOS Ranking Score
123456  1   42       17
645123  3   84       20

我想对分组和未分组的数据执行一组聚合,如下所示:

代码语言:javascript
复制
var grouped = table.GroupBy(x => x.score )
                    .Select(x => new 
                    {
                        Score = x.Key.ToString(),
                        OverallAverageRank = x.Average(y => y.Ranking),
                        Year1RankAvg = x.Where(y => y.YOS == 1).Average(y => y.Ranking),
                        Year2RankAvg = x.Where(y => y.YOS == 2).Average(y => y.Ranking)
                        //...etc
                    });

我还想在相同的切片和整集数据上执行不同的聚合(标准差)。

我不知道如何同时对YOS进行分组和不分组,虽然这样编译得很好,但当涉及到运行时时,如果有任何YOS平均值在,我会得到"Sequence contains no element“。

EN

回答 1

Stack Overflow用户

发布于 2019-06-21 02:01:07

与任何编程一样,当您有一系列相似的项时,请使用集合。在本例中,我将其保留为IEnumerable,但如果需要,您可以将其设置为List或YOS的Dictionary。

代码语言:javascript
复制
var ans = table.GroupBy(t => t.Score)
               .Select(tg => new {
                    Score = tg.Key,
                   OverallAverageRank = tg.Average(t => t.Ranking),
                   YearRankAvgs = tg.GroupBy(t => t.YOS).Select(tyg => new { YOS = tyg.Key, RankAvg = tyg.Average(t => t.Ranking) })
               });

如果您需要填写从1到最大(或其他一些数字)的年份范围,您可以修改答案:

代码语言:javascript
复制
var ans2 = ans.Select(soryr => new {
                    soryr.Score,
                    soryr.OverallAverageRank,
                    YearRankDict = soryr.YearRankAvgs.ToDictionary(yr => yr.YOS),
                    YearMax = soryr.YearRankAvgs.Max(yr => yr.YOS)
              })
              .Select(soryr => new {
                  Score = soryr.Score,
                  OverAverageRank = soryr.OverallAverageRank,
                  YearRankAvgs = Enumerable.Range(1, soryr.YearMax).Select(yos => soryr.YearRankDict.ContainsKey(yos) ? soryr.YearRankDict[yos] : new { YOS = yos, RankAvg = 0.0 }).ToList()
              });

如果您愿意,可以修改原始ans以将RankAvg作为double?返回,并在添加缺少的年份时将null替换为0.0。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56582715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档