2016-03-28 20 views
6

私はC#を初めて使用しています。私は、ユーザー名などの文字列に特定の単語が含まれているかどうかを知りたいと思います。私は 文字列に配列を使用して特定の文字列が含まれているかどうかを確認します。

はまだラムダまたは正規表現をカバーすることができなかっただけで約一ヶ月のためのC#を学ぶあなたのすべてが、私に感謝array.Hereのexample.`

Console.Write("Name: "); 
_name = Console.ReadLine(); 
name = Program.ProperNameMethod(_name); 
Console.WriteLine(); 

string[] badWordArray = { "aBadword1", "aBadWord2", "aBadWord3" }; 

if (!string.IsNullOrEmpty(name) // Would like to check for the badwordarray aswell) 

(アップデート)から、それらの特定の単語を取得したいです。後でこれらのコードを見ていきます。

+0

何が 'ProperNameMethod'ですか? –

+0

@Reza Taiburは私の答えを受け入れるものとしてマークしてください。 –

+0

文字列の最初の単語をブロック文字に変換するメソッドを作成しました。@ un-lucky –

答えて

2

はおそらく大文字と小文字を区別しません検証したい:

string[] badWordArray = { "aBadword1", "aBadWord2", "aBadWord3" }; 

Boolean isBadWord = badWordArray 
    .Any(badWord => name.IndexOf(badword, StringComparison.OrdinalIgnoreCase) >= 0); 

をそれとも、現在のカルチャに確認する場合

Boolean isBadWord = badWordArray 
    .Any(badWord => name.IndexOf(badWord, StringComparison.CurrentCultureIgnoreCase) >= 0); 

Paranoic場合は、次のように正規表現を使用することを含む:

string[] badWordArray = { "aBadword1", "aBadWord2", "aBadWord3" }; 

    // Nasty user wants to be rude but pass typical filters... 
    String name = "A- Bad..WORD..1 !!!"; 

    String line = Regex.Replace(name, @"\W", ""); 

    Boolean isBadWord = badWordArray 
    .Any(badWord => line.IndexOf(badWord, StringComparison.OrdinalIgnoreCase) >= 0); 
+0

私はあなたの「パラノイックなケース」の回答を好きでした。しかし、containsを使うと正規表現を使う方が効率的です。 –

+0

@Lost_In_Library:これは達成したいことに依存します。効率(悪い言葉の巨大な配列)の場合、あなたはかなり正しいです。しかし、あなたが失礼である可能性を排除したい場合、悪い言葉の陰影、正規表現などを使用する必要があります。 –

4

次のラムダ式を使用して、名前に悪い単語が含まれているかどうかを調べます。

bool nameHasBadWords = badWordArray.Any(p => name.Contains(p)); 
+0

"p"とは何ですか? @マシェチャンド? –

+0

pは、配列の個々の要素を表すために使用されるエイリアスです。 –

3

ここに私ができることがあります。

 // Lowered bad words array 
     string[] badWordArray = { "abadword1", "abadword2", "abadword3" }; 

     bool isBadWord = false; 
     if (!string.IsNullOrEmpty(name)) 
     { 
      name = name.ToLower(); 
      isBadWord = badWordArray.Any(badWord => name.Contains(badWord)); 
     } 

他の回答もテストしました。

459ミリ秒

.Any(badWord => string.Equals(name, badWord, StringComparison.CurrentCultureIgnoreCase)); 

1464ミリ秒

.Any(badWord => name.IndexOf(badWord, StringComparison.CurrentCultureIgnoreCase) >= 0); 

247ミリ秒:ここ

.Any(badWord => name.Contains(badWord)); 

は私の簡単です(&愚か)試験コード:

 var name = "tuckyou"; 

     // Lowered bad words array 
     string[] badWordArray = { "abadword1", "abadword2", "abadword3" }; 

     Stopwatch stopwatch = new Stopwatch(); 

     int oneMillion = 1000000; 

     bool isBadWord = false; 

     stopwatch.Start(); 
     for (int i = 0; i < oneMillion; i++) 
     { 
      isBadWord = badWordArray.Any(badWord => string.Equals(name, badWord, StringComparison.CurrentCultureIgnoreCase)); 
     } 
     stopwatch.Stop(); 

     Console.WriteLine(stopwatch.ElapsedMilliseconds); 
     stopwatch.Reset(); 

     stopwatch.Start(); 
     for (int i = 0; i < oneMillion; i++) 
     { 
      isBadWord = badWordArray.Any(badWord => name.IndexOf(badWord, StringComparison.CurrentCultureIgnoreCase) >= 0); 
     } 
     stopwatch.Stop(); 

     Console.WriteLine(stopwatch.ElapsedMilliseconds); 
     stopwatch.Reset(); 

     stopwatch.Start(); 
     if (!string.IsNullOrEmpty(name)) 
     { 
      name = name.ToLower(); 
     } 

     for (int i = 0; i < oneMillion; i++) 
     { 
      isBadWord = badWordArray.Any(badWord => name.Contains(badWord)); 
     } 
     stopwatch.Stop(); 

     Console.WriteLine(stopwatch.ElapsedMilliseconds); 

     Console.ReadLine(); 

勿論、ストップウォッチを用いては正確ではありません。しかしそれはアイデアを与えている。

0

あなたはあなたが初心者だと考えていると考えています。ここには簡単な方法があります。私はこれらの答えがこれより優れていることを知っていますが、これは初心者にとっては良いはずです。

  Console.Write("Name: "); 
      string userInput = Console.ReadLine(); 

      //The words that you dont want your user to have 
      string[] array = new string[2]; 
      array[0] = "bad"; 
      array[1] = "reallybad"; 

      for (int i = 0; i < array.Length; i++) 
      { 

       //Used to lower so user cant get away with stuffs like: rEALLyBAd 
       if (userInput.Contains(array[i].ToLower())) 
       { 

        Console.WriteLine("Invalid name!"); 

       } 

      } 

      Console.ReadKey(); 
関連する問題