C# 带*的过滤器将约束以Null开头的所有值?

C# 带*的过滤器将约束以Null开头的所有值?,c#,filter,filtering,visual-studio-lightswitch,C#,Filter,Filtering,Visual Studio Lightswitch,我有以下代码,它扩展了我的过滤功能,允许我搜索多个邮政编码。例:12541251455 当前代码: 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开头的

我有以下代码,它扩展了我的过滤功能,允许我搜索多个邮政编码。例:12541251455

当前代码:

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开头的邮政编码。非常感谢

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等。

使用正则表达式:

例如:

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+。有关更多详细信息,请参阅文档。

您可以用\d*替换*这基本上是表示任意数量数字的正则表达式。然后运行并使用Regex.IsMatch进行过滤


我试图让它尽可能接近您的代码,但您可以稍微清理一下,然后使用lambda。但这也同样有效:

对于以123结尾的东西,你也希望能做*123这样的事情吗?对于以1结尾和以1开头的东西,你也希望能做*1吗?@Hjalmar:这也很好,我也能做。嗨Bondaryuk:这行查询=在查询中从p开始,PostCode_Array.Containsp.Post_Code选择p;我应该删除它吗?@Zayed是的,你可以。如果只需要startwith,请使用var zipCodeList=PostCode_Array.Wherex=>x.StartsWithstartWith;嗨,我不明白你怎么做这个var过滤器=0;?。我有一个名为Post_Code_PAR的参数,用户在其中输入值。我想过滤掉那些山谷,以防他写了一些像1455->这样的东西,这将得到所有以1455@Zayed对不起,我明白你们的意思,现在我改变答案,现在用户可以找到:231254它返回wher StartsWith和endwith你们的意思是如果我输入123*我将得到所有以123开头的数字?因为这就是我想要的使用System.Text.RegularExpressions;在文档顶部。它在哪里说的?仅供参考:我的数据集中的字段post代码是一个字符串,参数也是一个字符串。我想我忘了获取属性,请再试一次。我现在在您的选择下有一条红线,出现此错误9。类型“System.Collections.Generic.IEnumerable”无法隐式转换为“string[]”。已存在显式转换。也许你错过了一个演员。我只是使用Console.WriteLine检查它是否在示例程序中工作:它将结果写入dos控制台。您可以忽略最后两行。备注:您更喜欢linq语法myList。其中。。。而不是myList中的myItem…:在大多数情况下,它更具可读性。请参阅响应的添加如果要在post code模式中保留单个*,可以在开始时用myString.Replace*,*动态替换它。这样,您就保留了regex的强大功能,可以用于将来的扩展,并继续避免使用if语句。您可以将示例代码复制并粘贴到C控制台应用程序的公共静态void主入口点中,它将编译并运行。从这一点上,你可以根据你的需要调整它,并测试结果。备注:我根本不是正则表达式专家。几年前,我刚刚学会使用它们来满足类似的需求。我发现,最好的学习方法是使用regexbuddy软件。但是你也可以问stackoverflow,也许是另外一个问题。
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();
}