我怎么能重构这个函数,所以它可以采用任意多个参数?
程序有多个参数,如年龄,颜色等......
所以我有这个功能:
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();
}
由于我在Program中有多达10个关系,我想有一个处理它的函数是有意义的吗?
编辑: 我怎么能返回年龄或颜色列表,而不是像:
中的intpublic IEnumerable<Color> GetColorsOnProgram(IEnumerable<Program> ProgramList)
{
return (from x in ProgramList
where x.Colors.Any()
select x.Colors);
}
答案 0 :(得分:3)
只需致电programList.Count(p => p.Ages.Any())
,programList.Count(p => p.Colors.Any())
等
对于您的修改,如果您想要任何程序中所有颜色(或任何颜色)的单个列表,则需要programList.SelectMany(p => p.Colors)
,可能后跟.Distinct()
。
答案 1 :(得分:1)
您可以将功能更改为:
public int GetCountOnProgram(IEnumerable<Program> ProgramList, Func<Program,bool> whereClause)
{
return ProgramList.Where(whereClause).Count();
}
然后用:
来调用它GetCountOnProgram(programList, x => x.Ages.Any());
答案 2 :(得分:0)
除了@ Wouter的正确答案,并且在回答您的编辑时,您可以添加如下方法:
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。