用于在各种状态/步骤中过滤/计数集合的设计模式

本文关键字:过滤 集合 设计模式 状态 用于 | 更新日期: 2023-09-27 18:27:47

我从一个IEnumerable开始,并希望通过几个包含LINQ to SQL查询的方法运行它,这些查询将过滤结果集。一些方法将对原始结果集进行操作,其他方法将对进一步过滤的结果集进行处理。但是,我想保留提供的IEnumerable a和过滤的IEnumarable B的Excepts(反交叉?)的计数,以便在所有过滤方法结束时可以在电子邮件中发送计数。例如,如果方法A提供了一个60条记录的集合,但经过筛选,结果减少到20条记录,我想把数字40存储在某个地方。

建议采用什么方法来跟踪计数和集合/查询?我曾想过使用IQueryable并在方法中使用out参数执行Count()来跟踪计数,但这似乎很混乱。是否有某种设计模式适合这个过程?

用于在各种状态/步骤中过滤/计数集合的设计模式

interface IFilter<T>
{
     IQueryable<T> Filter(IQueryAble<T> data);
}
interface IResultSet<T>
{
    int OrignalCount { get; }
    int FilteredCount { get; }
    IEnumerable<T> Result { get; }
    void AddFilter(IFilter<T> filter);
}

以及IResultSet:的实现

class ResultSet<T> : IResultSet<T>
{
     private IQueryable<T> data;
     private List<IFilter> filters = new List<IFilter>();
     public int OriginalCount {get; private set;}
     public int FilteredCount 
     {
         get { return Result.Count(); }
     }
     public IEnumerable<T> Result 
     {
         get 
         {
             IQueryable data = this.data;
             foreach(IFilter filter in filters)
             {
                 data = filter.Filter(data);
             }
             return data;
         }
     }
     //constructor
     public ResultSet<T>(IQueryable<T> data)
     {
          this.data = data;
          this.OriginalCount = data.Count();              
     }
     public void AddFilter(IFilter<T> filter)
     {
         this.filters.Add(filter);
     }
}