2016-03-28 21 views
6

dizisini kullanarak belirli bir dizgi içerip içermediğini kontrol edin. Kullanıcı adı gibi bir dizenin belirli bir sözcük içerip içermediğini bilmek istiyorum. Ben Bir dizenin

henüz lambda veya regex kapsamaz tek bir ay kadar C# öğrenmeye hepinize ama bana teşekkür et bir array.Here en bir 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) 

(Güncelleme) gelenler belirli kelimeleri almak istiyorum. Bu kodlara daha sonra bakacağım.

+0

'ProperNameMethod' –

+0

@Reza Taibur, size yardımcı olması durumunda lütfen yanıtımı kabul edildi olarak işaretleyin. –

+0

Dizenin ilk sözcüğünü bir Blok harfine dönüştürecek bir yöntem yaptım. @ Şanssız –

cevap

2

Muhtemelen harf duyarsız doğrulama istiyorum:

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

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

Yoksa akım kültürü doğrulamak eğer

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

Paranoic vaka böyle düzenli ifadeler kullanarak içerir:

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

"Paranoik olay" cevabını sevdim efendim. Ama içeriklerini kullanmak regex kullanmak için daha etkilidir. –

+0

@Lost_In_Library: elde etmek istediğiniz şeye bağlıdır. Verimlilik durumunda (büyük bir dizi kötü kelime) ve lax kontrolü oldukça haklısınız.Ama eğer kaba olma ihtimalini ortadan kaldırmak istiyorsanız, kötü bir kelimenin gölgesi, normal ifadeleri ve benzerlerini kullanmak zorundasınız. –

4

Adın kötü sözcük içerip içermediğini bulmak için aşağıdaki lambda ifadesini kullanın.

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

bu "p" nedir? @Mahesh Chand? –

+0

p dizinin tek tek elemanını temsil etmek için kullanılan bir diğer addır. –

3

Yapabileceklerim;

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

Ayrıca diğer cevapları da test ettim;

459 ms:

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

1464 ms:

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

247 ms:

İşte
.Any(badWord => name.Contains(badWord)); 

benim basittir (& aptal) test kodu:

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

Tabii, kronometre kullanılarak doğru değildir. Ama bir fikir veriyor.

0

Yeni başladığınızı düşündüğünüzü düşünün. İşte daha kolay bir yol. Bu cevapların bundan daha iyi olduğunu biliyorum ama bu yeni başlayanlar için iyi olmalı.

  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(); 
İlgili konular