c# - C# Linq - 按相同属性的计数对 IEnumerable 进行排序
问题描述
我正在尝试找到一个 Linq 表达式,我可以在其中订购我的 IEnumerable,其中包括
string Country string City bool IsCapital
以一种新的 IEnumerable 列出所有对象的方式,但顺序是
- 县,但首先是列表中城市最多的国家,然后是条目第二多的国家,依此类推
- 然后按城市
我的第一次尝试是
IEnumerable allCities = new Enumerable {
//initialize list
};
allCities = allCities
.OrderBy(x => x.Country)
.ThenBy(x.City);
但当然不考虑同一国家内的城市数量。
我感谢您的帮助,在此先感谢您。
马丁
解决方案
您可以将 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" },
};
...会给出结果:
德国 - 柏林
德国 - 法兰克福
德国 - 慕尼黑
意大利 - 米兰
意大利 - 罗马
挪威 - 奥斯陆
法国 - 巴黎
推荐阅读
- c# - 通过结构将位图从 C# 传递到 C++
- angularjs - 在angularjs中读取Json
- javascript - 如何在onmessage中调用javascript websocket函数?
- c# - 在公共静态 void 方法中使用私有数组
- python-3.x - 如何创建适用于所有日期的时区感知时间对象?
- ansible - 使用 Ansible 监控日志文件的最新条目
- html - 响应式 BootStrap 4 选项卡
- ocaml - 在 parsetree.mli 中使用 Pexp_ident 是什么意思?
- php - 如何向多个收件人发送电子邮件 laravel
- angular - spyOn 在 Angular 6 的 Http 拦截器中不起作用