【问题标题】:Filter a list of string with wildcard使用通配符过滤字符串列表
【发布时间】:2019-11-18 20:17:05
【问题描述】:

我有一个对象列表,其中包含一些属性,例如“姓名”“姓氏”等...

在 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”,“ gaaaaaaaaaaaaaaaafy”,“gngiongiwngiowngwfy”。如何使用 Linq 实现这一目标?

【问题讨论】:

  • 看看这个thread 你可以在 Linq 方法中使用Regex.IsMatch()

标签: c# string linq string-matching


【解决方案1】:

您需要将通配符转换为正则表达式。您可以使用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"]

【讨论】:

  • 似乎您可能需要转义 input 中的正则表达式字符。例如如果var input = "Mr. Dan". 需要转义。 Regex.Escape 可能会对此有所帮助。
猜你喜欢
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多