c# - 按出现次数对 IEnumerable 进行排序

标签 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,但不是对同一对象的引用。

最佳答案

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);

关于c# - 按出现次数对 IEnumerable 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5583734/

相关文章:

django - 在 Django 中,如何以任意非字母顺序通过多项选择 CharField 进行排序?

c# - 从流中加载图像而不保持流打开

c# - 等待异步响应?

.net - 根据属性值过滤linq列表

C# 如果使用 LINQ 值为 NULL,则不要使用 GroupBy 进行聚合

php - 加入两个表,然后按日期排序,但合并两个表

mysql - Group_concat 内部排序

c# - List.ForEach 在技术上是 LINQ 的一部分吗?

c# - TakeLast 在 .net core 3.1 中没有按预期工作

c# - 无法将 lambda 表达式转换为类型 'object',因为它不是委托(delegate)类型