在C#中,如何获取列表属性的前几项



我有一个项目对象,它有一个赞助商列表(这是一个Person对象数组),如下所示

var projectA = GetProject();
IEnumerable<Person> sponsors = projectA.Sponsors;

我现在有这些项目对象的列表

List<Project> projects = GetProjects();

我正在努力争取所有项目的"顶级赞助商"

如果一个项目只有一个赞助商,我会这样做:

var topSponsors = projects.GroupBy(r->r.Sponsor).OrderByDescending(g->g.Count)

但在我的情况下,一个项目有多个赞助商,所以我正在寻找正确的语法,以显示项目列表中的顶级赞助商?

举个例子,比如

项目1===>赞助商(Tim,Joe)
项目2===>赞助商(Tim)
项目3===>赞助商(账单)
项目4===>赞助商(Tim,Joe)

我想通过以下方式订购:

Tim(3个项目)
Joe(2个项目)
账单(1个项目)

那么你想要项目中所有人中排名前n的人吗?

var top10Persons = projects
    .SelectMany(p=> p.Sponsors)
    .GroupBy(p => p)
    .OrderByDescending(g => g.Count())
    .Take(10)
    .Select(g => g.First());

这假定Person覆盖Equals+GetHashCode。你也可以为GroupBy.提供一个自定义的IEqualityComparer<Peerson>如果你也想要每个人的Count,你可以选择一个匿名类型:

    .....
    .Take(10)
    .Select(g => new { Count = g.Count(), Person = g.First() });

这应该可以做到:

var bestSponsors = projects.SelectMany(p => p.Sponsors)
    .GroupBy(p => p.Name)
    .OrderByDescending(g => g.ToList().Count)
    .Select(p => new
           {
               Name = p.Key,
               SponsoredProjectCount = p.ToList().Count
           })
    .ToList();

我假设你有一个这样的人类:

public class Person
{
    public string Name { get; set; }
}

最新更新