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

Ste*_*ven 5 .net c# email

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

string[] validDomains = { "@test1.com", "@test2.com", "@test3.com" };
string email = "test@test1.com"
Run Code Online (Sandbox Code Playgroud)

有没有办法检查是否email包含任何值validDomains而不使用循环?

Ser*_*nov 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!
}
Run Code Online (Sandbox Code Playgroud)

HashSet.Contains方法是一个O(1)操作; 而数组 - O(n).所以HashSet<T>.Contains非常快.此外,HashSet不存储重复值,并且没有必要将它们存储在您的案例中.

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


Dou*_*las 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);
Run Code Online (Sandbox Code Playgroud)

@从您的域中排除该字符也是有意义的,因为它将存在于所有域中,从而冗余:

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);
Run Code Online (Sandbox Code Playgroud)

  • 你是认真的吗?将计算查找从O(n)减少到O(1)是不成熟的优化吗?你甚至知道那个词是什么意思吗? (4认同)