有效地验证大型对象列表

时间:2014-12-10 15:18:25

标签: c#-4.0

我有一个功能,如果某个字段未通过验证检查(电子邮件或电话,但在此上下文中并不重要),则该功能旨在从集合中删除项目。问题是正则表达式相对较慢,我有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)检查,但与此同时,我希望得到一些比我聪明的人的意见。

0 个答案:

没有答案