从接口获取多对多
本文关键字:获取 接口 | 更新日期: 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);