Отфильтруйте список строк с подстановочными знаками - PullRequest
1 голос
/ 09 июля 2019

У меня есть список объектов с некоторыми свойствами, такими как «Имя», «Фамилия» и т. Д ...

В приложении Windows Forms я помещаю два текстовых поля, одно для имени и одно для фамилии, когдаПользователь должен что-то записать в это текстовое поле, код должен фильтровать список на основе того, что написал пользователь.

//Let assume that the customer object has two props...name and surname and we have an object called Customers with a long list
List<customer> CustomersFiltered = new List<customer>();

CustomersFiltered = Customers.FindAll((x => x.Name.ToLower().StartsWith(txtName.Text.ToLower())).ToList();
CustomersFiltered = CustomersFiltered.FindAll((x => x.Surname.ToLower().StartsWith(txtSurname.Text.ToLower())).ToList();
//make something amazing withe the CustomersFiltered object

Этот код функционирует очень хорошо, но фильтрует, только если пользователь пишет инициал имени или фамилии.Что мне нужно, так это если пользователь пишет «g ?? fy», фильтр должен возвращать «goofy», но также и «gaffy» и так далее, и если пользователь пишет «g * y», фильтр должен возвращать «goofy», «gaaaaaaaaaaaaaaaafy "," gngiongiwngiowngwfy ".Как я могу добиться этого с Linq?

1 Ответ

3 голосов
/ 09 июля 2019

Вам необходимо преобразовать ваш шаблон в регулярное выражение.Вы можете сделать это с помощью метода string.Replace:

var input = "a?bc*d";

var pattern = input
    .Replace("?", "[a-z]")
    .Replace("*", "[a-z]*");

Теперь используйте метод Regex.IsMatch внутри лямбды

var test = new[] {"axbcd", "abcxxxxxd", "axdcd", "axbcxxxxd" }.ToList();
var match = test.FindAll(x => Regex.IsMatch(x, pattern, RegexOptions.IgnoreCase));
// match == ["axbcd", "axbcxxxxd"]
...