在 C# 中,如何按对象中的属性对集合进行排序
本文关键字:集合 排序 属性 对象 何按 | 更新日期: 2024-10-30 05:08:42
我有一个 Person 对象的集合,一个人可以属于多个团队
public class Person
{
public List<string> Teams();
}
所以我有这些对象的集合
List<Person> people = GetPeople();
现在给定集合,我想获取最常用的团队列表
我可以通过这样做获得所有团队的完整列表:
var teams = people.SelectMany(r=>r.Teams);
或者我可以通过这样做获得一个不同的团队列表:
var teams = people.SelectMany(r=>r.Teams).Distinct(new TeamComparer());
但我现在想获得前 10 名的球队。
按最常用的团队对团队进行排序的正确方法是什么? 所以例如,如果我有
var person = new Person(){Teams = new List<string>{"Team A", "Team D"} }
var person2 = new Person(){Teams = new List<string>{"Team B", "Team C"} }
var person3 = new Person(){Teams = new List<string>{"Team B", "Team C"} }
var person4 = new Person(){Teams = new List<string>{"Team B", "Team D"} }
所以在上面的例子中,它会按顺序返回:
B
队C
队D
队A队
如果要获得使用计数最高的十个团队,则应对它们进行分组,而不是使用 Distinct()
消除重复项。有了组后,按组计数排序,并取前十个,如下所示:
var topTen = people
.SelectMany(r => r.Teams) // Get the teams with duplicates
.GroupBy(t => t) // Group by team
.OrderByDescending(g => g.Count()) // Sort by count
.Take(10) // Take top ten
.Select(g => g.Key) // Drop groups
.ToList(); // Make a list
List<Person> lstpeople = GetPeople();
lstPerson = lstPerson.OrderBy(x => x.personID).toList();
lstPerson = lstPerson.orderbydescending(x => x.personID).toList();