今日、dear 述語によってさらに単純化された非常に単純な問題に直面しました。一種のイベント ログがあり、条件のリストを使用してクライアント側 (Windows フォーム) でフィルター処理したいと考えていました。いくつかのカテゴリでフィルタリングする実装から始めました。
private List<Events> FilterEventsByCategory(List<Events> events,
List<Category> categories)
{
return events.FindAll(ev =>
categories.Exists(category => category.CategoryId==ev.CategoryId));
}
次のステップは、他のいくつかのフィルターを実装することです。これらを一般化して、フィルターごとに 1 つのメソッドを作成する必要がないようにする良い方法を知っていますか? または、少なくとも、同時に適用したいフィルターの動的リストを作成するクリーンな方法です。
クライアントはまだフレームワーク 3.0 を使用しているため、LINQ はありません。
更新: 自分のソリューションの功績を認めるべき人物を決めるのに苦労しました。マークにはいくつかの素晴らしいアイデアがあり、それらを説明するのが本当に上手です。私の問題をもう少しうまく説明していれば、おそらく彼から答えが得られたでしょう。最終的に、私を軌道に乗せたのは、cmartin が提供した汎用 Filter クラスでした。以下で使用される 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)));