Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,如何获取列表属性的顶部项?_C#_Collections_Group By - Fatal编程技术网

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

在C#中,如何获取列表属性的顶部项?,c#,collections,group-by,C#,Collections,Group By,我有一个项目对象,它有一个发起人列表(它是一个Person对象数组),如下所示 var projectA = GetProject(); IEnumerable<Person> sponsors = projectA.Sponsors; 但是在我的例子中,一个项目有多个赞助者,所以我在寻找正确的语法,它显示了这个项目列表中的顶级赞助者 var top10Persons = projects .SelectMany(p=> p.Sponsors) .GroupB

我有一个项目对象,它有一个发起人列表(它是一个Person对象数组),如下所示

var projectA = GetProject();
IEnumerable<Person> sponsors = projectA.Sponsors;
但是在我的例子中,一个项目有多个赞助者,所以我在寻找正确的语法,它显示了这个项目列表中的顶级赞助者

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

项目1==>赞助商(蒂姆、乔)
项目2==>赞助商(Tim)
项目3==>发起人(法案)
项目4==>赞助商(蒂姆、乔)

我想通过以下方式订购:

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
覆盖
等于
+
GetHashCode
。您还可以为
GroupBy提供一个自定义
IEqualityComparer
如果您还需要每个人的
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();
我假设您有这样一个person类:

var topSponsors = projects.GroupBy(r->r.Sponsor).OrderByDescending(g->g.Count)
public class Person
{
    public string Name { get; set; }
}

你如何定义“顶级赞助商”?你能提供一个输入和期望输出的例子吗?这是一个打字错误:“我有个人对象”?我猜你的意思是“我有一个项目对象”。用实数类型替换
var
。@TimSchmelter-是的,我修复了typo@Christos-我添加了一些示例数据以澄清我的请求