在 C# 中,如何获取作为列表属性的顶级项目?
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();
并且我正在尝试为所有项目获取 "top sponsors"
如果一个项目只有一个发起人,我会这样做:
var topSponsors = projects.GroupBy(r->r.Sponsor).OrderByDescending(g->g.Count)
但在我的例子中,一个项目有多个赞助商,所以我正在寻找能够显示此项目列表中顶级赞助商的正确语法?
举个例子,假设
项目 1 ==> 发起人(蒂姆、乔)
项目 2 ==> 赞助商 (Tim)
项目 3 ==> 发起人 (Bill)
项目 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>
如果您还想要每个人的 Count
,您可以 select 匿名类型:
.....
.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();
我假设你有这样一个人class:
public class Person
{
public string Name { get; set; }
}
我有一个项目对象,它有一个赞助商列表(这是一个 Person 对象数组),如下所示
var projectA = GetProject();
IEnumerable<Person> sponsors = projectA.Sponsors;
我现在有这些项目对象的列表
List<Project> projects = GetProjects();
并且我正在尝试为所有项目获取 "top sponsors"
如果一个项目只有一个发起人,我会这样做:
var topSponsors = projects.GroupBy(r->r.Sponsor).OrderByDescending(g->g.Count)
但在我的例子中,一个项目有多个赞助商,所以我正在寻找能够显示此项目列表中顶级赞助商的正确语法?
举个例子,假设
项目 1 ==> 发起人(蒂姆、乔)
项目 2 ==> 赞助商 (Tim)
项目 3 ==> 发起人 (Bill)
项目 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>
如果您还想要每个人的 Count
,您可以 select 匿名类型:
.....
.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();
我假设你有这样一个人class:
public class Person
{
public string Name { get; set; }
}