2012-02-27 51 views
3

我怎樣才能重構這個函數,以便它可以採取任何多到許多參數?重構LINQ函數

計劃有許多許多參數,如年齡,膚色,等...

所以我有這樣的功能:

public int GetAgesOnProgram(IEnumerable<Program> ProgramList) 
{ 
    return (from x in ProgramList 
     where x.Ages.Any() 
     select x.Ages).Count(); 
} 

,但我還需要這一個:

public int GetColorsOnProgram(IEnumerable<Program> ProgramList) 
{ 
    return (from x in ProgramList 
     where x.Colors.Any() 
     select x.Colors).Count(); 
} 

由於我在程序中有多達10個多對多的關係,我想有一個單一的函數可以處理它嗎?

編輯: 我怎麼能返回年齡或顏色列表中,而不是一個int爲:

public IEnumerable<Color> GetColorsOnProgram(IEnumerable<Program> ProgramList) 
{ 
    return (from x in ProgramList 
     where x.Colors.Any() 
     select x.Colors); 
} 

回答

1

你可以改變你的函數:

public int GetCountOnProgram(IEnumerable<Program> ProgramList, Func<Program,bool> whereClause) 
{ 
    return ProgramList.Where(whereClause).Count(); 
} 

然後用叫它:

GetCountOnProgram(programList, x => x.Ages.Any()); 
+1

不應該將該方法重新命名爲'GetCountOnProgram(..)',因爲它不再只是獲得年齡? – Jamiec 2012-02-27 10:18:59

3

只需致電programList.Count(p => p.Ages.Any()),programList.Count(p => p.Colors.Any())

對於編輯,如果您想要任何程序中的所有顏色(或任何)的單個列表,您需要programList.SelectMany(p => p.Colors),可能後跟.Distinct()

+0

另外,謝謝 - 直到現在我還沒有意識到'伯爵'有一個重載謂詞。 – Rawling 2012-02-27 10:22:33

0

除了@沃特的正確答案,並在回答您的編輯,你可以添加一個方法,如:

public static IEnumerable<T> GetItemsOnProgram<T>(IEnumerable<ProgramItem> ProgramList, Func<ProgramItem,IEnumerable<T>> selectClause) 
{ 
    return ProgramList.SelectMany(selectClause); 
} 

,然後用它喜歡:

GetItemsOnProgram(programList, x => x.Ages); 

獲取列表所有節目中的所有年齡段。這不會是一個明確的列表,但您可以在最後標記Distinct() - 雖然您可能需要提供一個Comparer來告訴它如何使項目不同。有關文檔,請參閱here