Равенства и содержит для текстового поиска


Я пытаюсь реализовать обычный поиск для приложения, написанного на C#. Требования таковы:

Пользователь может выбрать один из следующих вариантов для поиска:

  1. Property Search(Exact): текст, введенный в поле поиска должен точно совпадать с результатами, например, поиск PL стоит только показать результаты, чьи свойства содержат PL.
  2. Property Search(Contains): текст, введенный в поле поиска может быть, например, поиск PL должно показать все результаты свойства которых содержат PLнапример, конструктор, планирование, занятия и т. д.

Я реализовал это в мой код путем передачи boolean флаг мой метод, и с помощью if..else для выполнения поисковых запросов соответственно.

    public override bool PropertySearch(string value, bool searchPartial = false)
    {
        if(searchPartial)
        {
            if (dataValue.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0)
                return true;
        } else
        {
            if (dataValue.Equals(value, StringComparison.OrdinalIgnoreCase))
                return true;
        }
        return false;
    }

Это была моя первая реализация, и у меня есть ощущение, что может быть лучше и лаконичный способ добиться этого. Какие мысли?



127
0
задан 22 февраля 2018 в 11:02 Источник Поделиться
Комментарии
3 ответа

Поток управления кажется слишком многословным. Этот будет делать то же самое:

public override bool PropertySearch(string value, bool searchPartial = false)
{
return searchPartial ? (dataValue.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0)
: dataValue.Equals(value, StringComparison.OrdinalIgnoreCase);
}

Я также сомневаюсь в вашем решении сваливать эти две операции в один и тот же метод. Код, вероятно, будет понятнее, если вы написали два разных метода. Но вы не показали суперкласс или остальные этого класса, поэтому я не могу сказать точно.

3
ответ дан 23 февраля 2018 в 12:02 Источник Поделиться

Мне не нравится этот метод с использованием двух различных методов методом поиска. Придерживаясь только IndexOf на мой взгляд чище, поэтому я бы рефакторинг этот метод как:

public static bool PropertySearch(string value, bool partialMatch = false)
{
var indexOf = dataValue.IndexOf(value, StringComparison.OrdinalIgnoreCase);
var contains = indexOf >= 0;
var sameLength = indexOf == 0 && dataValue.Length == value.Length;
var exactMatch = contains && sameLength;
return
partialMatch
? contains
: exactMatch;
}


Хотя Regex один лайнер даже приятнее:

public bool PropertySearch(string value, bool partialMatch = false)
{
return Regex.IsMatch(dataValue, partialMatch ? value : $"^{value}$", RegexOptions.IgnoreCase);
}

1
ответ дан 23 февраля 2018 в 05:02 Источник Поделиться

Я думаю, передать параметр и изменить код, это не очень хорошая идея.
возможно ли сделать такой?

PartialPropertySearch(...)
PropertyEqualsSearch(...)

конечно, если это уже определенные рамки и вы не можете изменить его.
затем вы можете сделать такой стиль:

public override bool PropertySearch(string value, bool searchPartial = false)
{
if(searchPartial)
return (dataValue.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0)
else
return (dataValue.Equals(value, StringComparison.OrdinalIgnoreCase))
}

Кстати, мне не нравится стиль return searchPartial ? true п.... : ложное положение ...

0
ответ дан 23 февраля 2018 в 01:02 Источник Поделиться