2012-02-24 56 views
-1

这是我的场景。我正在做一个电话号码注册组件,它将拒绝一些带有特定前缀的号码(例如“95973”或“95949”)。我已经将这些前缀存储在数据库中了。C#“Like”搜索类似于SQL查询“LIKE”

我想知道的是,是否有任何C#方法可用于将注册号与我想拒绝的前缀进行匹配。

与伪代码

BEGIN 
GET phone num FROM querystring 
FOR EACH banned prefix IN DB 
    CHECK if phone num BEGINS WITH banned prefix 
     IF TRUE, RESPOND TO phone num WITH error message 
     ELSE, REGISTER phone num 
END EACH 
END 
+1

你可以使用正则表达式。 LINQ。子串检查可以给你更多关于如何获得代码中表示的电话号码和前缀的信息。 – rerun 2012-02-24 07:01:11

+0

你只想做SomeString.Contains(“95973”)吗? – Tod 2012-02-24 07:01:17

回答

5

您可以使用String.StartWith方法更新。

 string phone = "9182323243"; 
string[] prefix = {"93","94","85"}; 

if (prefix.Any(pre => phone.StartsWith(pre))) 
    //Reject 
else 
    //Accept 
2

最简单:

 var prefix = "95973"; 
     var number = "95973-123456"; 
     var reject = number.Contains(prefix); 
     var reject2 = number.StartsWith(prefix); 
2

快速和效率不高的方式,描述你在做什么,是下面的LINQ行:

// load all prefixes 
IEnumerable<string> prefixes = GetPrefixes(); 

// does Any prefix exists such that "number" starts with it? 
bool reject = prefixes.Any(p => number.StartsWith(p)) 

如果你知道你的前缀总是很长5你可以做一个非常有效的精确查询:

string number = "1234567889"; 

// get the prefix part 
string prefix = number.Substring(0, 5); 

// check if prefixes contains it 
bool reject = prefixes.Contains(prefix); 

在任何情况下,如果你不经常更新前缀,并且它们不是一个巨大的数额(如果它们长5个字符,它们不是一个巨大的数量:))我建议你从内存中加载它们的数据库,说在HashSet<string>和使用后一种方法,它会快速bleerzing。

0

我已经有写PB操作系统的经验。所以,在你的情况最好的办法是写规则像这样: * - 任何数字的数字,可能是0 ? - 一个任意数字

例子:

规则: “23948?”,数量应该从 “23948” 开始,并应包含

规则后第2位: “9 *”,所有号码,开始从数字9开始(在这种情况下,PBX必须等待用户输入,例如在每个输入的数字之后和下一个之前2秒)。

所以,在这种情况下,你必须使用正则表达式