【问题标题】:How to group by age and gender with IComparable?如何使用 IComparable 按年龄和性别分组?
【发布时间】:2016-06-15 05:18:43
【问题描述】:

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

至少一个对象必须实现 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)),但我不会有性别。

【问题讨论】:

  • GenderName的类型是什么?
  • GenderName的类型是字符串
  • 你试过用元组代替匿名对象吗?
  • @Luiso Tuples 几乎总是一个坏主意,只需创建一个类,尤其是看起来 OP 将按原样使用结果。
  • @KennethK。我同意你的观点,但是如果在方法中使用了该查询,并且你知道自己在做什么,他们可以节省一些时间并且不得不实现一个几乎没用的类

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


【解决方案1】:

当您订购您的组结果时,您使用 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)

【讨论】:

    【解决方案2】:

    当你这样做时:

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

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

    【讨论】:

    • 省略, l.GenderName 不会执行他想要的组。
    • 我认为这个答案解释了编译错误,但@Luiso 在原帖中关于元组的评论提供了一个很好的答案。
    • @KennethK.,我并不是说这会执行他想要的分组。但要点:这不是一个“答案”,所以我应该把它作为评论发布。
    • @wablab 你的答案是正确的,这更像是 x y 问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多