按事件排序IEnumerable

时间:2011-04-07 15:37:41

标签: c# linq sql-order-by ienumerable

我有一个来自Linq2Sql的可枚举实体集合(它们已经被这个阶段枚举到一个数组中)。集合可能(可能会)包含同一实体的多次出现。我如何订购集合,以便最常出现的实体被移到前面?

IEnumerable<Entity> results = SearchForEntities(searchCriteria);

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

我应该在OrderByDescending表达式中提供什么帮助?

提前致谢! :)

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

试试这个:

IEnumerable<Entity> results = SearchForEntities(searchCriteria);

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