我有一个包含字段UserID,Property:
的对象列表我想按大多数共享属性值排序列表。因此,如果每个用户都拥有Property =“Popular”,那么应首先出现。如果除了一个用户之外的每个人都有Property =“Second”,那么它应该在列表中排名第二... 即使它只为每个用户使用过一次。
我会对每个可能的Property执行distinct(),但是对于许多可能的Property来说这似乎并不高效。
答案 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();