今天我们遇到了一个非常简单的问题,而亲爱的谓词使这个问题变得更加简单。我们有一种事件日志,并希望使用标准列表过滤它的客户端(Windows 窗体)。我们首先实现了按多个类别进行过滤。
private List<Events> FilterEventsByCategory(List<Events> events,
List<Category> categories)
{
return events.FindAll(ev =>
categories.Exists(category => category.CategoryId==ev.CategoryId));
}
下一步是实现几个其他过滤器。您是否知道一种将这些概括为可能不必为每个过滤器编写一个方法的好方法?或者至少是一种干净的方式来获得我们想要同时应用的过滤器的动态列表。
客户端仍在框架 3.0 上,因此没有 LINQ。
更新: 我很难决定我的解决方案应该归功于谁。Marc 有一些不错的想法,并且非常擅长解释它们。如果我能更好地解释我的问题,我很可能会从他那里得到答案。最终,是 cmartin 提供的通用 Filter 类让我走上了正轨。下面使用的过滤器类可以在 cmartins 的答案和您自己梦想的用户类中找到。
var categoryFilter = new Filter<Event>(ev => categories.Exists(category => category.CategoryId == ev.CategoryId));
var userFilter = new Filter<Event>(ev => users.Exists(user => user.UserId == ev.UserId));
var filters = new List<Filter<Event>>();
filters.Add(categoryFilter);
filters.Add(userFilter);
var eventsFilteredByAny = events.FindAll(ev => filters.Any(filter => filter.IsSatisfied(ev)));
var eventsFilteredByAll = events.FindAll(ev => filters.All(filter => filter.IsSatisfied(ev)));