2015-04-01 33 views
1

我有有所見如下在C#中,如何獲取屬性列表中的頂級項目?

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

我現在有這些項目的對象列表

List<Project> projects = GetProjects(); 

,我的贊助商名單(這是Person對象數組)項目對象試圖讓「頂級贊助商」的所有項目

如果一個項目有一個單一的贊助商,我會做這樣的事情:

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

但在我的情況下,一個項目有多個贊助商,所以我正在尋找正確的syntaxt,顯示這個項目列表中的頂級贊助商?

作爲一個例子,讓我們說

項目1 ==>贊助商(TIM,喬)
項目2 ==>贊助商(TIM)
項目3 ==>贊助商(比爾)
項目4 ==>贊助商(TIM,喬)

我希望通過訂購:

添(3個項目)
喬(2個項目)
條例草案(1個項目)

+1

你如何定義「頂級贊助商」?你能否提供一個輸入和期望輸出的例子? – Christos 2015-04-01 21:07:45

+0

這是一個錯字:「我有一個人物」?我假設你的意思是「我有一個項目對象」。用真正的類型重新裝備'var'。 – 2015-04-01 21:08:25

+0

@TimSchmelter - 是的,我修正了錯字 – leora 2015-04-01 21:54:22

回答

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,你可以選擇一個anonymos類型:

..... 
    .Take(10) 
    .Select(g => new { Count = g.Count(), Person = g.First() }); 
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; } 
} 
相關問題