我有一组有效的电子邮件地址域。给定一个电子邮件地址,我想看看它的域是否有效
string[] validDomains = { "@test1.com", "@test2.com", "@test3.com" };
string email = "test@test1.com"
有没有办法在不使用循环的情况下检查是否email
包含任何值?validDomains
我想向您推荐以下代码:
HashSet<string> validDomains = new HashSet<string>
{
"test1.com", "test2.com", "test3.com"
};
const string email = "test@test1.com";
MailAddress mailAddress = new MailAddress(email);
if (validDomains.Contains(mailAddress.Host))
{
// Contains!
}
HashSet.Contains 方法是一个 O(1) 操作;而数组 - O(n)。所以HashSet<T>.Contains
速度极快。此外,HashSet
不存储重复值,并且没有必要将它们存储在您的案例中。
MailAddress 类表示电子邮件发件人或收件人的地址。它包含邮件地址解析逻辑(只是不要重新发明轮子)。
如果你想提高效率,不仅应该避免使用循环,而且应该HashSet
为允许的域构造一个,这将允许 O(1) 查找:
string[] validDomains = { "@test1.com", "@test2.com", "@test3.com" };
HashSet<string> validDomainsHashSet = new HashSet<string>(validDomains);
string email = "test@test1.com";
string domain = email.Substring(email.IndexOf('@'));
bool isValidDomain = validDomainsHashSet.Contains(domain);
从您的域中排除该字符也是有意义的@
,因为它会存在于所有域中,因此是多余的:
string[] validDomains = { "test1.com", "test2.com", "test3.com" };
HashSet<string> validDomainsHashSet = new HashSet<string>(validDomains);
string email = "test@test1.com";
string domain = email.Substring(email.IndexOf('@') + 1);
bool isValidDomain = validDomainsHashSet.Contains(domain);
使用 LINQ 的最简单方法(这也忽略了这种情况):
bool validEmail = validDomains
.Any(d => email.EndsWith(d, StringComparer.OrdinalIgnoreCase));
int index = email.IndexOf("@");
var domain = email.Substring(index)
return validDomains.Any(x=>x == domain);
看一下这个:
string[] validDomains = { "@test1.com", "@test2.com", "@test3.com" };
string email = "test@test1.com";
if (validDomains.Contains(email.Substring(email.IndexOf("@"))))
{
}
以这种方式使用 for each 循环:
string[] validDomains = { "@test1.com", "@test2.com", "@test3.com" };
string email = "test@test1.com";
foreach (string x in validDomains)
{
if (email.Contains(x))
{
// Do Something
}
}
没有以这种方式循环(使用 LINQ):
if(validDomains.Any(s => email.Contains(s))) {
//Do Something
}
validDomains.Any(validDomain => email.EndsWith(validDomain))
有关详细信息,请参阅IEnumerable.Any 的文档。