在C#中,如何获取列表属性的顶级项?

时间:2015-04-01 21:05:01

标签: c# collections group-by

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

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

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

List<Project> projects = GetProjects();

我正试图获得#34;顶级赞助商&#34;对于所有项目

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

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

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

举个例子,让我们说

项目1 ==&gt;赞助商(Tim,Joe)
项目2 ==&gt;赞助商(蒂姆)
项目3 ==&gt;赞助商(比尔)
项目4 ==&gt;赞助商(蒂姆,乔)

我想订购:

蒂姆(3个项目)
乔(2个项目)
比尔(1个项目)

2 个答案:

答案 0 :(得分: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。您还可以为IEqualityComparer<Peerson>提供自定义GroupBy.如果您还想要每个人的Count,您可以选择匿名类型:

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

答案 1 :(得分:0)

这应该可以解决问题:

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; }
}