5

有効な電子メールアドレスドメインの配列があります。電子メールアドレスを指定して、そのドメインが有効かどうかを確認したい

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

ループを使用せずemailにの値が含まれているかどうかを確認する方法はありますか?validDomains

4

7 に答える 7

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メソッドはO(1)操作です。while配列-O(n)。とてもHashSet<T>.Contains速いです。また、HashSet重複する値を保存しないでください。また、ケースにそれらを保存する意味はありません。

MailAddressクラスは、電子メールの送信者または受信者のアドレスを表します。これには、メールアドレス解析ロジックが含まれています(車輪の再発明をしないためだけです)。

于 2012-08-14T18:14:46.683 に答える
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);
于 2012-08-14T18:16:18.043 に答える
3

LINQを使用する最も簡単な方法(これもケースを無視します):

bool validEmail = validDomains
   .Any(d => email.EndsWith(d, StringComparer.OrdinalIgnoreCase));
于 2012-08-14T18:16:31.790 に答える
2
int index = email.IndexOf("@");
var domain = email.Substring(index)
return validDomains.Any(x=>x == domain);
于 2012-08-14T18:16:23.250 に答える
2

これをチェックしてください:

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

        }
于 2012-08-14T18:16:24.727 に答える
1

このようにforeachループを使用します:

    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 
}
于 2012-08-14T18:17:47.937 に答える
-3
validDomains.Any(validDomain => email.EndsWith(validDomain))

詳細については、IEnumerable.Anyのドキュメントを参照してください。

于 2012-08-14T18:17:26.187 に答える