【问题标题】:Order IEnumerable by occurrences按出现次数排序 IEnumerable
【发布时间】:2011-04-07 15:37:41
【问题描述】:

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

IEnumerable<Entity> results = SearchForEntities(searchCriteria);

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

对我应该在 OrderByDescending 表达式中添加什么有任何帮助吗?

提前致谢! :)

编辑:根据要求进行澄清。集合中多次出现的实体具有唯一 ID,但不是对同一对象的引用。

【问题讨论】:

  • 所以你不在乎某些实体被删除了?您选择的答案只返回每组的第一个。
  • 是的,这是我的意图,从 .Distinct 调用中不是很明显吗?
  • 啊,不知怎的,我完全错过了。

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


【解决方案1】:
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);

【讨论】:

  • 非常感谢 - 我什至没有想到分组!
【解决方案2】:

试试这个:

IEnumerable<Entity> results = SearchForEntities(searchCriteria);

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

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2014-04-03
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2016-08-16
    • 2012-04-06
    相关资源
    最近更新 更多