2016-03-28 43 views
6

我是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) 

(更新)獲取這些特定的詞

謝謝大家,但我學習C#僅約一個月不能覆蓋拉姆達或正則表達式呢。稍後我會看看這些代碼。

+0

什麼是'ProperNameMethod' –

+0

@Reza Taibur請標記我的答案爲接受,如果它可以幫助你。 –

+0

我做了一個方法,將字符串的第一個單詞轉換爲一個Block信件。@ 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可以更有效地使用regex。 –

+0

@Lost_In_Library:這取決於你想達到什麼。如果效率很高(大量壞話)和鬆懈的控制,你是非常正確的。但是,如果你想消除一種粗魯的可能性,一個不好的字眼的影子,你必須使用正則表達式等。 –

4

使用下面的lambda表達式來查找名稱是否包含壞詞。

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

那是什麼「p」? @Mahesh Chand? –

+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(); 

Ofcourse,使用秒錶是不準確的。但它提供了一個想法。

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(); 
相關問題