我有以下代码,它扩展了我的过滤器功能,允许我搜索多个邮政编码。例如。(1254,125,145,1455)
当前代码:
if (Post_Code_PAR != null)
{
String[] PostCode_Array = Post_Code_PAR.Split(',');
query = from p in query where PostCode_Array.Contains(p.Post_Code) select p;
}我想以一种方式扩展这个代码,如果我给它类似( 0 *)的东西,它会找到从0开始的邮政编码。如果我给它123*,它会给我所有以123开头的邮政编码。非常感谢。
发布于 2015-04-15 19:25:26
使用正则表达式:
示例:
IEnumerable<string> allInputs = new[] {"70000", "89000", "89001", "90001"};
string commaSeparatedPostCodePatterns = @"89000 , 90\d\d\d";
if (string.IsNullOrWhiteSpace(commaSeparatedPostCodePatterns))
return;
string[] postCodePatterns = commaSeparatedPostCodePatterns
.Split(',')
.Select(p => p.Trim()) // remove white spaces
.ToArray();
var allMatches =
allInputs.Where(input => postCodePatterns.Any(pattern => Regex.IsMatch(input, pattern)));
foreach (var match in allMatches)
Console.WriteLine(match);对于这样的问题,初始需求非常简单,但很快就会变得越来越复杂(由于国际化,规则的例外,一些智能测试人员测试意外的极限情况,如90§$% ...)。因此,正则表达式提供了简单性与可扩展性的最佳折衷。
等同于*的正则表达式是.*。但在您的示例中,您宁愿使用更多限制性模式,并使用与单个数字匹配的\d占位符。可选数字为\d?。零个或多个数字将为\d*。一个或多个数字将是\d+。有关更多详细信息,请参阅文档。
发布于 2015-04-15 19:47:04
您可以将*替换为\d*,这基本上是Regex表示“任意数量的数字”的方式。然后运行并使用Regex.IsMatch()进行过滤。
if (Post_Code_PAR != null)
{
var PostCode_Array = from p in Post_Code_PAR.Split(',') select String.Format("^{0}$", p.Replace("*", @"\d*"));
query = (from p in query where PostCode_Array.Any(pattern => Regex.IsMatch(p.Post_Code, pattern)) select p).ToArray();
}我试着让它尽可能接近你的代码,但是你可以把它清理一下,用lambda代替。但这应该也能正常工作:)
发布于 2015-04-15 19:06:38
string Post_Code_PAR = "";
String[] PostCode_Array = Post_Code_PAR.Split(',');
var zipCodeList = query.Where(x => CustomFilter(x.Post_Code, PostCode_Array)).ToList();
private static bool CustomFilter(string code, string[] foundZipCodes)
{
return foundZipCodes.Any(x =>
{
x = x.Trim();
var text = x.Replace("*", "");
if (x.EndsWith("*"))
return code.StartsWith(text);
if (x.StartsWith("*"))
return code.EndsWith(text);
if (x.Contains("*"))
return false;
return code.StartsWith(text);
});
}现在用户可以找到:"0*,*52“等。
https://stackoverflow.com/questions/29648425
复制相似问题