У меня есть List<Locations>
, который будет отфильтрован, чтобы получить набор результатов, относящихся к поисковому запросу.Возвращение большинства релевантных результатов поиска с использованием LINQ Где/взять
На данный момент, я попробовал эти «результаты поиска» путем фильтрации со следующим:
return locations.Where(o => o.Name.Contains(term)).Take(10).ToList();
Проблема
Если я войду «Chester» как термин поиска, я буду никогда не см. пункт «Честер», несмотря на то, что он существует в списке locations
. Причиной этого является то, что в списке есть 10 или более других элементов, которые содержат строчку «Честер» от их имени (Манчестер, Дорчестер и т. Д.).
Как я могу использовать LINQ, чтобы в первую очередь взять результаты, которые начинаются с поискового запроса?
Что у меня есть So Far
var startsWithList = list.Where(o => o.Name.StartsWith(term)).Take(10).ToList();
var containsList = list.Where(o => o.Name.StartsWith(term) && !startsWithList.Contains(o)).Take(10 - startsWithList.Count).ToList();
return startsWithList.AddRange(containsList);
Мне не нравится выше код на всех. Я чувствую, что это должно быть достигнуто в одном Where
, в отличие от выполнения двух «Куда» и «Take» и объединения двух списков.
общий путь вы делаете что-то вроде этого с забитым матчем, так что если значение = поиск оценка = 1000, если начинается с, то оценкой = 100, если содержит балл = 10, если частично содержит балл = 1, то вы суммируйте все баллы и порядок по сумме, прежде чем принимать свой результирующий набор, хотя это, вероятно, сложнее, чем вам нужно. – MikeT
Похоже, вы хотите что-то вроде [приблизительного соответствия строк] (https://en.wikipedia.org/wiki/Approximate_string_matching), чтобы узнать, какой из них лучший результат. –