C# 按属性的共享值排序列表

C# 按属性的共享值排序列表,c#,linq,C#,Linq,我有一个具有字段UserID和属性的对象列表: 我想按最共享的属性值对列表进行排序。因此,如果每个用户都有Property=“Popular”,那么应该首先考虑这个问题。若除了一个用户之外的所有人都有Property=“Second”,那个么该属性在列表中应该排在第二位。。。 即使每个用户只使用一次 我会对每个可能的属性执行distinct(),但对于许多可能的属性,这似乎并不有效。您可以在属性上使用分组,根据每组中的计数数对组进行排序,然后使用SelectMany()再次展平列表: 从您的问题

我有一个具有字段UserID和属性的对象列表:

我想按最共享的属性值对列表进行排序。因此,如果每个用户都有Property=“Popular”,那么应该首先考虑这个问题。若除了一个用户之外的所有人都有Property=“Second”,那个么该属性在列表中应该排在第二位。。。 即使每个用户只使用一次


我会对每个可能的属性执行distinct(),但对于许多可能的属性,这似乎并不有效。

您可以在
属性上使用分组,根据每组中的计数数对组进行排序,然后使用
SelectMany()
再次展平列表:

从您的问题来看,我不太清楚您是否希望显示重复项,以及您是否对
用户ID
感兴趣。如果没有,您只需选择组的键,即可按所需顺序为您提供唯一属性值的
列表

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();

但这是按属性的总频率排序的,而不是按唯一用户排序的??那么你应该澄清你的问题。您希望如何对列表项进行排序,以及应该返回什么?更新的答案-我想这就是您要寻找的。我想我的问题很清楚,我甚至说我将使用Distinct,但不知道如何做不同的事情。不管怎么说,似乎很管用,谢谢。
var props = myList.GroupBy(x => x.Property)
                  .OrderByDescending(g => g.Select(x=> x.UserID)
                                           .Distinct()
                                           .Count())
                  .Select(g => g.Key);
                  .ToList();