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

时间:2014-10-23 21:23:48

标签: c# linq design-patterns linq-to-sql

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

跟踪计数和集合/查询的推荐方法是什么?我正在考虑使用IQueryable并使用out参数在方法中执行Count()来跟踪计数,但这看起来很麻烦。是否有某种设计模式适合这个过程?

1 个答案:

答案 0 :(得分:1)

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);
     }
}