[英]In C#, how can I get the top items that are properties of a list?
我有一个项目对象,其中有一个赞助者列表(是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 ==>赞助商(蒂姆,乔)
项目2 ==>赞助商(Tim)
项目3 ==>赞助商(账单)
项目4 ==>赞助者(蒂姆,乔)
我想按以下顺序订购:
蒂姆(3项目)
乔(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>
GroupBy.
如果您还想要每个人的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; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.