c# - 我想按值的频率对列表进行排序并区分它c#
问题描述
我有一个整数列表,例如
List<int> Lst = {1,1,1,2,2,3,3,3,4,4}
我希望这个列表是
Lst = {1,3,2,4}
(按值的频率和不同排序,所以 1 是第一个,3 之后,2 之后,4 感谢您的帮助:D
我正在做一个项目,我有一个这样的列表,我需要重新排列它
我还没有尝试让它与代码一起工作,因为我想不出一种让它工作的方法
我希望函数的输出是一个排列成 {1,3,2,4} 的列表谢谢:D
解决方案
使用 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 对象的生成顺序基于 source 中生成每个 IGrouping 的第一个键的元素的顺序。分组中的元素按照它们在源中出现的顺序产生。
OrderByDescending
以及稳定的事实(再次参见备注),因此如果两个项目比较相等,则保留它们的顺序)。
该方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定的排序不会保留具有相同键的元素的顺序。
推荐阅读
- julia - JuliaBox:如何在 JuliaBox 中安装 GitHub 包?看图片
- ffmpeg - ffmpeg:drawtext 使用 zmq 淡入/淡出
- react-native - 使用 detox 对 Toast 动画进行 e2e 测试的更好方法
- google-maps-api-3 - 解释为什么“自动完成”不能返回结果,但谷歌地图可以
- excel - 如何在excel中合并两列中的数据以形成具有合并数据的新列
- android-studio - 为什么我们一般不在 kotlin 中使用私有变量?就像在 java c++ 等
- python - groupby 和滚动窗口的问题
- c# - POST 请求在 C# 中返回 404,但在 Postman 中不返回
- ios - 如何从复杂的崩溃日志中找到崩溃的原因
- javascript - 定时器从输入的值开始