2011-04-07 35 views
1

我有一个来自Linq2Sql的实体的可枚举集合(它们已被枚举到此阶段的数组)。集合可能(可能会)包含同一实体的多个事件。我将如何去订购收藏品,以便最常发生的实体被移到前面?按发生次序排序IEnumerable

IEnumerable<Entity> results = SearchForEntities(searchCriteria); 

return results.OrderByDescending(e => /* Number of occurences in results? */) 
       .Distinct() 
       .Take(maxSearchResults); 

对我应该在OrderByDescending表达式中加入什么帮助?

提前致谢! :)

编辑:澄清要求。收集中出现的实体不止一次具有唯一的ID,但是对同一对象的引用是而不是

+0

所以你不在乎,一些实体被删除?您选择的答案仅返回每个组的第一个答案。 – 2011-04-07 16:07:33

+0

是的,这是我的意图,是否从.Distinct呼叫中不明显? – MattDavey 2011-04-08 07:45:53

+0

啊,不知何故,我完全错过了。 – 2011-04-08 14:21:19

回答

4
return results.GroupBy(r => r) 
       .OrderByDescending(g => g.Count()) 
       .Select(g => g.Key) 
       .Take(maxSearchResults); 

的问题是:这个集合包含多个实体具有相同ID还是有实际的同一个实体对象多个引用?

如果第一个广告是这样(通过ID),您可能希望这样:

return results.GroupBy(r => r.ID) 
       .OrderByDescending(g => g.Count()) 
       .Select(g => g.First()) 
       .Take(maxSearchResults); 
+0

非常感谢 - 组合甚至没有发生在我身上! – MattDavey 2011-04-07 15:57:57

2

试试这个:

IEnumerable<Entity> results = SearchForEntities(searchCriteria); 

return results.OrderByDescending(e => results.Where(a=>a == e).Count()) 
      .Distinct() 
      .Take(maxSearchResults); 
+0

+1这也是一个很好的答案:) – MattDavey 2011-04-07 15:58:43

+0

谢谢。我也没有想过分组! – Matt 2011-04-07 16:04:34