按属性的共享值排序列表

时间:2012-04-22 21:58:55

标签: c# linq

我有一个包含字段UserID,Property:

的对象列表

我想按大多数共享属性值排序列表。因此,如果每个用户都拥有Property =“Popular”,那么应首先出现。如果除了一个用户之外的每个人都有Property =“Second”,那么它应该在列表中排名第二... 即使它只为每个用户使用过一次。

我会对每个可能的Property执行distinct(),但是对于许多可能的Property来说这似乎并不高效。

1 个答案:

答案 0 :(得分:2)

您可以在Property上使用分组,按照每个组中的计数来对组进行排序,然后使用SelectMany()再次展平列表:

var items = myList.GroupBy(x => x.Property)
                  .OrderByDescending(g => g.Count())
                  .SelectMany(g => g);
                  .ToList();

从您的问题来看,我不清楚您是否希望重复显示,以及您是否对UserID感兴趣。如果没有,您只需选择组的键即可按所需顺序为您提供List<string>个唯一属性值:

var props = myList.GroupBy(x => x.Property)
                  .OrderByDescending(g => g.Count())
                  .Select(g => g.Key);
                  .ToList();

修改

看起来这更像是你实际上正在寻找的东西 - 组是按具有给定属性的唯一用户的数量排序的。

var props = myList.GroupBy(x => x.Property)
                  .OrderByDescending(g => g.Select(x=> x.UserID)
                                           .Distinct()
                                           .Count())
                  .Select(g => g.Key);
                  .ToList();