2012-02-27 8 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

3

だけ呼び出すprogramList.Count(p => p.Ages.Any())programList.Count(p => p.Colors.Any())など

あなたの編集では、あなたのプログラムのすべての色(または何でも)を1つのリストにしたい場合は、programList.SelectMany(p => p.Colors)を、その後には.Distinct()を続けてください。リストを取得するには

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

:@はWouterの正しい答えに加えて

+0

また、感謝しています。今まで、「カウント」には述語を取った過負荷があったことはわかりませんでした。 – Rawling

0

、そしてあなたの編集への答えに、あなたは次のようにメソッドを追加することができます。

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

そして好きそれを使用すべてのプログラムのすべての年齢のこれは別のリストではありませんが、最後にDistinct()というタグを付けることができます。Comparerを入力して項目を区別する方法を教えてください。ドキュメントについては、hereを参照してください。

関連する問題