1 回答

TA贡献1884条经验 获得超4个赞
使用 Linq 相当简单GroupBy:
var input = new [] {1,1,1,2,2,3,3,3,4,4};
var output = input.GroupBy(x => x)
.OrderByDescending(x => x.Count())
.Select(x => x.Key)
.ToList();
GroupBy(x => x)
:创建 4 个组的列表。每个组都有一个键,它是数字,值是组的成员。所以你会有类似的东西{ 1: [1, 1, 1], 2: [2, 2], 3: [3, 3, 3], 4: [4, 4] }
OrderByDescending(x => x.Count())
:按组中项目的数量对组进行排序,最大的组在前。所以你得到{ 1: [1, 1, 1], 3: [3, 3, 3], 2: [2, 2], 4: [4, 4] }
Select(x => x.Key)
:从每组中取出钥匙,所以你得到[1, 3, 2, 4]
ToList()
: 把它全部变成一个列表
如果有两组具有相同数量的项目——在您的示例中,有三个 1 和三个 3——那么这将按照它们在输入中出现的顺序对它们进行排序(因此,这里的输出是[1, 3, 2, 4]
,因为 1在输入中出现在 3 之前)。
这是因为(见备注)的排序行为:GroupBy
IGrouping 对象的生成顺序基于生成每个 IGrouping 的第一个键的源中元素的顺序。分组中的元素按照它们在源代码中出现的顺序生成。
并且事实OrderByDescending
是稳定的(同样,请参见备注),因此如果两个项目比较相等,则它们的顺序将被保留)。
此方法执行稳定排序;也就是说,如果两个元素的键值相等,则保留元素的顺序。相反,不稳定排序不会保留具有相同键的元素的顺序。
- 1 回答
- 0 关注
- 88 浏览
添加回答
举报