我有一个人的名单,我想要每小时登记的人数。我使用了下面的GroupBy
子句,我得到了正确的结果。
var persons = lstPerson.GroupBy(x =>(x.CreatedOn.Hour))
.Select(grp => new { total = grp.Count(), key = grp.Key })
.OrderBy(x => x.key)
.ToList();
但我想要每小时一次。它只显示计数的值。如果第一个小时没有人注册,那么它在列表中没有显示0个计数。
因此,例如,有人只注册了13,14,5小时(意味着在13:00,14:00和15:00),然后它显示了它的计数,但没有显示其他时间。
答案 0 :(得分:0)
有两种选择:
首先,对代码进行最少更改,您只需向每个组“添加一个”,然后从每个计数中“减去一个”:
var persons = lstPerson
.Select(x => (x.CreatedOn.Hour)) // Get the hours from the people
.Concat(Enumerable.Range(0, 24)) // Add an extra copy of each hour
.GroupBy(h => h) // ↓ subtract the extra hours
.Select(grp => new { total = grp.Count() - 1, key = grp.Key })
.OrderBy(x => x.key)
.ToList();
其次,更整洁但涉及替换所有代码,您可以将人员列表加入到小时列表中:
var persons = Enumerable.Range(0, 24)
.GroupJoin(
lstPerson,
h => h, // Correlate the hours in the range
p => p.CreatedOn.Hour, // with the hours from each person
(h, ps) => new { total = ps.Count(), key = h))
.ToList(); // ↑ This selects one element for each hour in the range