我有一个包含字段 UserID、Property 的对象列表:
我想按最共享的属性值对列表进行排序。因此,如果每个用户都有 Property=“Popular”,那么它应该首先出现。如果除了一个用户之外的每个人都具有 Property=“Second”,则该属性应该出现在列表中的第二位...... 即使每个用户只使用一次。
我会在每个可能的属性上执行distinct(),但这对于许多可能的属性来说似乎效率不高。
最佳答案
您可以对 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();
关于c# - 按属性(property)共享值(value)排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10272483/