2016-03-28 3 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) 

(Update)

Спасибо всем, кроме меня обучение C# только в течение месяца не может покрыть лямбда или регулярное выражение еще. Я посмотрю на эти коды позже.

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

параноика случай предполагает использование регулярных выражений так:

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»? @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(); 
Смежные вопросы