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

How to group by age and gender with IComparable?

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

At least one object must implement 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))但我不会有性别。

当你这样做时:

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

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

当您使用 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 字段。

如果您想以某种方式对结果进行排序,您应该指向这样的字段:

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

或者这样:

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

如果您想先通过 Age 订购,然后通过 GenderName 使用 ThenBy 扩展方法,如下所示:

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