重构LINQ函数

时间:2012-02-27 10:12:31

标签: c# 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();
}

由于我在Program中有多达10个关系,我想有一个处理它的函数是有意义的吗?

编辑: 我怎么能返回年龄或颜色列表,而不是像:

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

3 个答案:

答案 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