在 C# 中,如何按对象中的 属性 对集合进行排序?

In C#, How can I sort a collection by a property in an object?

我有一个 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"} }

所以在上面的例子中,它会 return 顺序:

B 队
C队
D队
A 队

List<Person> lstpeople = GetPeople();
lstPerson = lstPerson.OrderBy(x => x.personID).toList();
lstPerson = lstPerson.orderbydescending(x => x.personID).toList();

如果您想获得使用次数最多的十个团队,您应该将它们分组,而不是使用 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