如何检查字符串是否包含值数组?

时间:2012-08-14 18:13:05

标签: c# .net email

我有一系列有效的电子邮件地址域。给定一个电子邮件地址,我想查看其域名是否有效

string[] validDomains = { "@test1.com", "@test2.com", "@test3.com" };
string email = "test@test1.com"

有没有办法在不使用循环的情况下检查email是否包含validDomains的任何值?

8 个答案:

答案 0 :(得分:10)

我想向您推荐以下代码:

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 Method是O(1)操作;而数组 - O(n)。所以HashSet<T>.Contains非常快。此外,HashSet不会存储重复的值,也没有必要将它们存储在您的案例中。

MailAddress Class代表电子邮件发件人或收件人的地址。它包含邮件地址解析逻辑(只是不重新发明轮子)。

答案 1 :(得分:5)

如果你想要有效率,不仅应该避免使用循环,而且你应该为你允许的域构建一个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);

答案 2 :(得分:3)

使用LINQ的最简单方法(这也忽略了这种情况):

bool validEmail = validDomains
   .Any(d => email.EndsWith(d, StringComparer.OrdinalIgnoreCase));

答案 3 :(得分:2)

int index = email.IndexOf("@");
var domain = email.Substring(index)
return validDomains.Any(x=>x == domain);

答案 4 :(得分:2)

检查出来:

        string[] validDomains = { "@test1.com", "@test2.com", "@test3.com" };
        string email = "test@test1.com";
        if (validDomains.Contains(email.Substring(email.IndexOf("@"))))
        {

        }

答案 5 :(得分:1)

以这种方式使用for循环:

    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 
}

答案 6 :(得分:1)

我认为简单的方法是使用linq和FirstOrDefault()

        string[] validDomains = { "@test5.com", "@test2.com", "@test3.com" };
        string email = "test@test1.com";

        var found = ((from domain in validDomains
                      where email.Contains(domain)
                      select domain).FirstOrDefault() != null);

答案 7 :(得分:-3)

validDomains.Any(validDomain => email.EndsWith(validDomain))

有关详细信息,请参阅documentation of IEnumerable.Any