21 lines
838 B
C#
21 lines
838 B
C#
using TrainingPlanner.Domain;
|
||
|
||
namespace TrainingPlanner.Application;
|
||
|
||
public static class ExerciseSearch
|
||
{
|
||
public static List<LibraryExercise> Find(IEnumerable<LibraryExercise> exercises, string query)
|
||
{
|
||
var search = Normalize(query);
|
||
var words = search.Split(' ', StringSplitOptions.RemoveEmptyEntries);
|
||
return exercises
|
||
.Where(exercise => words.All(word => Normalize(exercise.Name).Contains(word)))
|
||
.OrderByDescending(exercise => Normalize(exercise.Name) == search)
|
||
.ThenByDescending(exercise => Normalize(exercise.Name).StartsWith(search))
|
||
.ThenBy(exercise => exercise.Name, StringComparer.CurrentCultureIgnoreCase)
|
||
.ToList();
|
||
}
|
||
|
||
private static string Normalize(string value) => value.Trim().ToLowerInvariant().Replace('ё', 'е');
|
||
}
|