Сегодня мы столкнулись с довольно простой проблемой, которая стала еще проще благодаря дорогим предикатам. У нас был своего рода журнал событий, и мы хотели отфильтровать его на стороне клиента (Windows Forms), используя список критериев. Мы начали с внедрения фильтра по ряду категорий.
private List<Events> FilterEventsByCategory(List<Events> events,
List<Category> categories)
{
return events.FindAll(ev =>
categories.Exists(category => category.CategoryId==ev.CategoryId));
}
Следующим шагом является внедрение нескольких других фильтров. Знаете ли вы о хорошем способе их обобщить, чтобы, возможно, каким-то образом не приходилось писать по одному методу на фильтр? Или, по крайней мере, чистый способ иметь динамический список фильтров, которые мы хотим применить одновременно.
Клиенты по-прежнему работают на платформе 3.0, поэтому LINQ отсутствует.
Обновление:
Мне было трудно решить, кому я должен отдать должное за мое решение. У Марка было несколько хороших идей, и он действительно хорош в их объяснении. Скорее всего, я бы получил от него ответ, если бы только немного лучше объяснил свою проблему. В конечном счете, это был общий класс Filter, предоставленный cmartin, который помог мне в этом. Класс Filter, используемый ниже, можно найти в ответе cmartins, а также в классе User, который вы можете придумать сами.
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)));