我有一个带有一些属性的对象列表,例如“名称”,“姓氏”等...
在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做到这一点?
答案 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"]