使用通配符过滤字符串列表

时间:2019-07-09 09:44:27

标签: c# string linq string-matching

我有一个带有一些属性的对象列表,例如“名称”,“姓氏”等...

在Windows窗体应用程序中,我在文本框中输入了两个文本框,在姓氏中输入了一个文本框,当用户在文本框中输入内容时,代码应根据用户所写内容过滤列表。

//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”,“ gaaaaaaaaaaaaaaaaaafy”,“ gngiongiwngiowngwfy”。我如何用Linq做到这一点?

1 个答案:

答案 0 :(得分:3)

您需要将通配符转换为正则表达式。您可以使用string.Replace方法进行此操作:

var input = "a?bc*d";

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

现在在lambda中使用Regex.IsMatch方法

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