2016-03-28 18 views
6

Jestem nowy w języku C#. Chciałbym wiedzieć, czy ciąg znaków taki jak nazwa użytkownika zawiera określone słowo. Chcę, aby te szczególne słowa z array.Here to example.`Sprawdź, czy ciąg zawiera określony ciąg przy użyciu tablicy

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) 

(aktualizacja)

Dziękuję wszystkim oprócz mnie nauki C# tylko przez około miesiąc nie mogła pokryć lambda lub regex jeszcze. Będę je przeglądał później.

+0

co jest 'ProperNameMethod' –

+0

@Reza Taibur proszę zaznaczyć moją odpowiedź za przyjęte, jeśli to pomaga. –

+0

Zrobiłem metodę, która przekształci pierwsze słowo ciągu w literę. @ Un-lucky –

Odpowiedz

2

Prawdopodobnie chcesz wielkość liter ma znaczenie Walidacja:

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

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

Lub jeśli zweryfikować na obecnej kulturze

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

paranoiczny sprawa polega na wykorzystaniu wyrażeń regularnych tak:

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

Spodobał mi się twój "paranoiczny przypadek", proszę pana. Ale użycie opcji zawiera jest bardziej wydajne niż użycie wyrażenia regularnego. –

+0

@Lost_In_Library: to zależy od tego, co chcesz osiągnąć. W przypadku skuteczności (ogromna liczba złych słów) i luźnej kontroli masz rację.Ale jeśli chcesz wyeliminować tylko możliwość bycia niegrzecznym, cieniem złego słowa, musisz użyć wyrażeń regularnych i tym podobnych. –

4

Użyj następującego wyrażenia lambda, aby sprawdzić, czy nazwa zawiera złe słowa.

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

co to jest "p"? @Mahesh Chand? –

+0

p to alias używany do reprezentowania poszczególnych elementów tablicy. –

3

Oto, co mogłem zrobić;

 // 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)); 
     } 

Testowałem również inne odpowiedzi;

459 ms:

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

1464 ms:

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

247 ms:

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

Oto mój prosty (& głupi kod) Test:

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

Oczywiście, stosując stoper nie jest dokładna. Ale daje pomysł.

0

Biorąc pod uwagę, że powiedziałeś, że jesteś początkujący. Oto łatwiejszy sposób. Wiem, że te odpowiedzi są lepsze niż to, ale powinno to być dobre dla początkujących.

  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(); 
Powiązane problemy