如何按年龄和性别分组IComparable?

时间:2016-06-14 20:48:41

标签: c# asp.net-mvc linq-to-sql

像标题一样说我必须按年龄和性别分组,但我收到此错误消息:

  

至少有一个对象必须实现IComparable

var ageStats = vModel
               .GroupBy(l => new { Age = 10 * (l.Age / 10), l.GenderName })
               .OrderBy(x => x.Key)
               .Select(g => new
                            {
                                Name = g.Key,
                                Count = g.Select(l => l.Age).Count()
                            })
               .ToList();

如果我按年龄分组,那么它会起作用.GroupBy(l => 10 * (l.Age / 10))但我不会有性别。

2 个答案:

答案 0 :(得分:2)

当您订购小组结果时,使用Key,在您的情况下,复杂的匿名类型包含2个字段:

var ageStats = vModel
               .GroupBy(l => new { Age = 10 * (l.Age / 10), l.GenderName })
               .OrderBy(x => x.Key) //<-- this line
               .Select(g => new
                            {
                                Name = g.Key,
                                Count = g.Select(l => l.Age).Count()
                            })
               .ToList();

仅适用于Age分组,因为在这种情况下简单的int字段是anonymouse类型。

如果你想以某种方式订购你的结果你应该指向这样的字段:

.OrderBy(x => x.Key.Age)

或者这个:

.OrderBy(x => x.Key.GenderName)

如果您想先按Age订购,请GenderName使用ThenBy扩展方法,如下所示:

.OrderBy(x => x.Key.Age).ThenBy(x => x.Key.GenderName)

答案 1 :(得分:-1)

当你这样做时:

new { Age = 10 * (l.Age / 10), l.GenderName }

您正在创建一个匿名类型,我不相信实现IComparable。当您省略大括号和, l.GenderName时,表达式的结果为int,它会实现IComparable