我有一个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
您可以将Predicate替换为Func ,因为它暗示返回类型为bool。可能远离命名Predicate参数,因为它已经涉及到特定的内容。 –