c# - 按属性(property)共享值(value)排序列表

标签 c# linq

我有一个包含字段 UserID、Property 的对象列表:

我想按最共享的属性值对列表进行排序。因此,如果每个用户都有 Property=“Popular”,那么它应该首先出现。如果除了一个用户之外的每个人都具有 Property=“Second”,则该属性应该出现在列表中的第二位...... 即使每个用户只使用一次。

我会在每个可能的属性上执行distinct(),但这对于许多可能的属性来说似乎效率不高。

最佳答案

您可以对 Property 使用分组,按每组中的计数数量对组进行排序,然后使用 SelectMany() 再次展平列表。 :

var items = myList.GroupBy(x => x.Property)
                  .OrderByDescending(g => g.Count())
                  .SelectMany(g => g);
                  .ToList();

根据您的问题,我不太清楚您是否希望显示重复项,以及您是否对 UserID 感兴趣。 。如果没有,您只需选择组的键即可为您提供 List<string>按所需顺序排列的唯一属性值:

var props = myList.GroupBy(x => x.Property)
                  .OrderByDescending(g => g.Count())
                  .Select(g => g.Key);
                  .ToList();

编辑:

这似乎更符合您实际需要的内容 - 组是按具有给定属性的唯一用户的数量排序的。

var props = myList.GroupBy(x => x.Property)
                  .OrderByDescending(g => g.Select(x=> x.UserID)
                                           .Distinct()
                                           .Count())
                  .Select(g => g.Key);
                  .ToList();

关于c# - 按属性(property)共享值(value)排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10272483/

相关文章:

c# - 插入时如何从表中获取自动生成的 ID?

c# - 如何将动态 'where' 子句添加到 linq 查询?

c# - Expression<Action> 和 Expression<Action<T>> 之间的重载优先级

c# - 如何使用 Microsoft.Office.Interop.Word 将光标移动到特定段落?

c# - 从两个数据表中查找公共(public)列并将其用于 LINQ 中的连接条件

c# - 提取列表,其中字符串包含在列表中的列表中

c# - C# 中 assoc-diff 的名称

c# - 如何使用 OpenXML 包自动调整 excel 列

.NET 4.0 中的 C# 异步 wat

C#图表控件: X value of a horizontal bar chart is 0 for all points in the serie