私はユーザーが実行できる検索の種類のオプションを含むユーザーインターフェイスを持つC#アプリケーションを持っています。オプションは '複数の用語'(スペースで検索語を分割する)、 '大文字と小文字を区別する'、および '正規表現'です。将来、さらに多くのオプションが追加される可能性があります。述語のルックアップテーブル?
オプションは、IsMultipleTerms、IsCaseSensitive、およびIsRegularExpressionプロパティに格納されます。
の各オプションの組み合わせが異なる検索述語を持っていると、検索述語がそうのように定義されています。
private bool SearchCaseInsensitive(string field)
{
return field.ToLower().Contains(_searchTermLower);
}
private bool SearchCaseInsensitiveMultiple(string field)
{
return _searchTermsLower.All(field.ToLower().Contains);
}
私はそうのようなリストをフィルタリング:
var predicate = GetFilterPredicate();
SearchResults.Where(predicate);
私は現在使用して検索を実現SearchPredicateOptionSetというクラス:
public class PredicateOptionSet
{
public bool IsCaseSensitive { get; set; }
public bool IsRegularExpression { get; set; }
public bool IsMultipleTerms { get; set; }
public Func<SearchResult, bool> Predicate { get; set; }
public PredicateOptionSet(bool isCaseSensitive, bool isRegularExpression, bool isMultipleTerms,
Func<SearchResult, bool> predicate)
{
IsCaseSensitive = isCaseSensitive;
IsRegularExpression = isRegularExpression;
IsMultipleTerms = isMultipleTerms;
Predicate = predicate;
}
}
私が作成それらのリストを照会して照会してください:
private readonly List<PredicateOptionSet> _predicates;
public MainWindow()
{
_predicates = new List<PredicateOptionSet>
{
new PredicateOptionSet(true, false, false, result => Search(result.Name)),
new PredicateOptionSet(false, false, false, result => SearchCaseInsensitive(result.Name)),
new PredicateOptionSet(true, false, true, result => SearchMultiple(result.Name)),
new PredicateOptionSet(false, false, true, result => SearchCaseInsensitiveMultiple(result.Name)),
};
}
private Func<SearchResult, bool> GetFilterPredicate()
{
var predicate = from p in _predicates
where p.IsCaseSensitive == IsCaseSensitive &&
p.IsMultipleTerms == IsMultipleTerms &&
p.IsRegularExpression == IsRegularExpression
select p.Predicate;
return predicate.First();
}
これを達成するためのよりクリーンな方法はありますか?私は重要な概念が失われているように感じる。
'PredicateOptionSet'とは何ですか? – asawyer
質問本体に追加しました、ごめんなさい:) – Beau
Foolの代りにPredicate を代入することができます。おそらく、それは既に何か特定のものを参照しているので、パラメータ述語に名前をつけないでください。 –