2011-04-07 77 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