我想按值的频率对列表进行排序并将其区分c#

时间:2019-04-02 13:16:24

标签: c# list distinct frequency

例如,我有一个整数列表

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

1 个答案:

答案 0 :(得分:3)

使用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():将其全部转换为列表

如果有两组具有相同数量的项目-在您的示例中,有3个1和3个3-那么这将按照它们在输入中出现的顺序对它们进行排序(因此这里的输出是[1, 3, 2, 4],因为输入中1排在3之前。

这是由于ordering behaviour of GroupBy(请参见备注):

  

根据产生每个IGrouping第一个键的源中元素的顺序,按顺序产生IGrouping对象。分组中的元素按它们在源中出现的顺序产生。

OrderByDescending is stable(再次参见备注),因此,如果两个项目均等比较,则保留其顺序。

  

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