我有一个项目对象,其中包含一个赞助商列表(这是一个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个项目)答案 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; }
}