Linq将指标值转换为其他列和汇总数据

时间:2018-06-01 12:58:46

标签: c# linq

我正在尝试使用Linq汇总我的数据。我有一个没有正确设计的学生表,其中包含不必要的重复。我已经获取了数据,我正在尝试将其聚合为易于阅读。现有的数据结构如下:

| Course | Class  | Sex | Count |
---------------------------------
| Math   | Junior | M   | 20    |
| Math   | Junior | F   | 15    |
| Other  | Other  | M   | 10    |
| Other  | Other  | F   | 15    |

我正在尝试将上述内容转换为更简单的结构

| Course | Class  | Male| Female|
---------------------------------
| Math   | Junior | 20  | 15    |
| Other  | Other  | 10  | 15    |

我使用for循环来获取不同的课程并按性别获取记录并将它们合并到一个记录中,但这并不是真正有效的。现在有人用Linq查询来实现这一点,我认为它可以由Linq处理。

1 个答案:

答案 0 :(得分:4)

您可以在Linq中一步一步地按课程和课程分组(我使用了ValueTuple,但是匿名的课程分组键也可以)。

然后通过过滤和总结男性和女性来获得总和:

var results = courseCounts
     .GroupBy(cc => (cc.Course, cc.Class))
     .Select(grp => new 
             {
                 Course = grp.Key.Course,
                 Class = grp.Key.Class,
                 Male = grp.Where(x => x.Sex == "M").Sum(x => x.Count),
                 Female = grp.Where(x => x.Sex == "F").Sum(x => x.Count)
             });

(次要,但从性能的角度来看,对于较大的数据集,重复.Where(x => x.Sex == "x")两次效率低一点 - 我们可以先对Grouping + Dictionary中的数据进行关键操作)