从接口获取多对多

本文关键字:获取 接口 | 更新日期: 2023-09-27 18:26:00

我有一个类Program,它有几个多对多的关系,比如Age、Color。。。所有这些多对多属性都继承自接口IFilter。

如果我有一个IFilter的实例,我该如何继续调用下面的年龄或颜色函数?

ProgramList.CountByFilter(xxxMyFilterxxx, Filter.ID);
public static int CountByFilter(this IEnumerable<Program> ProgramList, Func<Program, IEnumerable<IFilter>> func, int ID)
{
         return (from x in ProgramList
                .Where(y => func.Invoke(y).Any(f => f.ID == ID))
                select x).Count();  
}

编辑:

对不起,我的意思是我该怎么打这些电话:

ProgramList.CountByFilter(x => x.Ages, Filter.ID)
ProgramList.CountByFilter(x => x.Colors, Filter.ID)

当我不知道过滤器上的对象时,比如:

ProgramList.CountByFilter(x => x.IFILTER, Filter.ID)

但是显而易见的是不起作用

从接口获取多对多

根据这个问题,我假设Filter有一个ID属性。

这是一个AND条件

    public static int CountByFilters(this IEnumerable<P> ProgramList, Expression<Func<P, IEnumerable<IFilter>>> exp, int[] ids)
    {
        var c = exp.Compile();
        HashSet<int> i = new HashSet<int>(ids);
        return (from x in ProgramList
                let filters = c.Invoke(x).Select(f => f.ID)
                where i.IsSubsetOf(filters)
                select x).Count();
    }

其中CCD_ 1可以是OR条件

传入筛选器ID似乎很混乱。你可能想重新考虑一下。在不了解更多藏品的情况下,无法说出演出会是什么样子。

如果IFilter包含一个成员来评估程序是否与筛选器匹配,那么代码会更简单:

public interface IFilter
{
    public Func<Program,bool> Matches { get; }
}
    public static int CountByFilter(this IEnumerable<P> ProgramList, IEnumerable<IFilter> filters)
    {
        return (from p in ProgramList
                where filters.Any(f => f.Matches(p))  //or All
                select p).Count();
    }

如何继续调用下面的年龄或颜色函数

类似这样的东西:

IFilter filter1 = /*... obtain an instance of IFilter (based on Age?) */;
IFilter filter2 = /*... obtain an instance of IFilter (based on Color?) */;
ProgramList.CountByFilter(program => new IFilter[] { filter1, filter2 }, Filter.ID);