2012-04-22 47 views
2

我有一个对象列表的字段UserID,属性:按属性共享价值排序列表

我想按大多数共享属性值排序列表。所以如果每个用户都有Property =“Popular”,那么应该首先提出。如果除了一个用户以外,每个用户都拥有Property =“Second”,那么它应该在列表中排在第二位...即使其仅用于每个用户一次。

我会对每个可能的属性执行distinct(),但是对于许多可能的Property来说,这看起来效率不高。

回答

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

但这是按财产的总频率排序,而不是由唯一用户排序。 ?? – zsharp 2012-04-22 22:18:18

+0

然后你应该澄清你的问题。您希望如何订购清单项目以及应退回的内容? – BrokenGlass 2012-04-22 22:20:32

+0

已更新的答案 - *我认为*这就是你要找的。 – BrokenGlass 2012-04-22 22:25:42