首页 > 解决方案 > C# Linq - 按相同属性的计数对 IEnumerable 进行排序

问题描述

我正在尝试找到一个 Linq 表达式,我可以在其中订购我的 IEnumerable,其中包括

string Country string City bool IsCapital

以一种新的 IEnumerable 列出所有对象的方式,但顺序是

  1. 县,但首先是列表中城市最多的国家,然后是条目第二多的国家,依此类推
  2. 然后按城市

我的第一次尝试是

IEnumerable allCities = new Enumerable { 
//initialize list
};

allCities = allCities
.OrderBy(x => x.Country)
.ThenBy(x.City);

但当然不考虑同一国家内的城市数量。

我感谢您的帮助,在此先感谢您。

马丁

标签: c#linqcountsql-order-by

解决方案


您可以将 LinqGroupBy()方法用作:

// 1. Group by country
// 2. Order descending by the count of each group
// 3. Select all objects of all groups (ordered) to a flat list
var result = cities
    .GroupBy(x => x.Country)
    .OrderByDescending(grp => grp.Count())
    .SelectMany(grp => grp.OrderBy(x => x.City))
    .ToList();

此对象列表:

var cities = new List<MyObj>
{
    new MyObj { Country = "Germany", City = "Frankfurt" },
    new MyObj { Country = "Norway", City = "Oslo" },
    new MyObj { Country = "Italy", City = "Rome" },
    new MyObj { Country = "Germany", City = "Berlin" },
    new MyObj { Country = "Germany", City = "Munich" },
    new MyObj { Country = "France", City = "Paris" },
    new MyObj { Country = "Italy", City = "Milano" },
};

...会给出结果:

德国 - 柏林
德国 - 法兰克福
德国 - 慕尼黑
意大利 - 米兰
意大利 - 罗马
挪威 - 奥斯陆
法国 - 巴黎


推荐阅读