首页 > 解决方案 > 我想按值的频率对列表进行排序并区分它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

标签: c#listdistinctfrequency

解决方案


使用 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以及稳定的事实(再次参见备注),因此如果两个项目比较相等,则保留它们的顺序)。

该方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定的排序不会保留具有相同键的元素的顺序。


推荐阅读