我有一个功能,如果某个字段未通过验证检查(电子邮件或电话,但在此上下文中并不重要),则该功能旨在从集合中删除项目。问题是正则表达式相对较慢,我有100万个项目的列表。
我的功能
public HashSet<ListItemModel> RemoveInvalid(HashSet<ListItemModel> listItems)
{
string pattern = (this.phoneOrEmail == "email")//phoneOrEmail is set via config file
?
//RFC 5322 compliant email regex. see http://www.regular-expressions.info/email.html
@"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"
:
//north-american phone number regex. see http://stackoverflow.com/questions/12101125/regex-to-allow-only-digits-hypens-space-parentheses-and-should-end-with-a-dig
@"(?:\d{3}(?:\d{7}|\-\d{3}\-\d{4}))|(?:\(\d{3}\)(?:\-\d{3}\-)|(?: \d{3} )\d{4})";
Regex re = new Regex(pattern);
if (phoneOrEmail == "email")
{
return new HashSet<ListItemModel>(listItems.Where(x => re.IsMatch(x.Email,0)));
}
else
{
return new HashSet<ListItemModel>(listItems.Where(x => re.IsMatch(x.Tel, 0)));
}
}
这需要太长时间才能执行。是否有更快的方法返回仅包含有效电子邮件/电话号码的子集?
我需要想出一些快速闪电的东西。我的其他操作通常在700k +项目上只需几秒钟,但这种方法需要永远,我讨厌这一点。我将尝试一系列LINQ .Contains(x,y,z)检查,但与此同时,我希望得到一些比我聪明的人的意见。