У меня есть приложение 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();
}
Есть ли более чистый способ добиться этого? Я чувствую, что могу упустить важную концепцию.