2016-03-28 20 views
6

Tôi mới sử dụng C#. Tôi muốn biết nếu một chuỗi như một tên người dùng có chứa một từ cụ thể. Tôi muốn nhận được những lời cụ thể từ một của array.Here một example.`Kiểm tra xem chuỗi có chứa chuỗi cụ thể không bằng cách sử dụng mảng

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ập nhật)

Cảm ơn tất cả các bạn nhưng tôi học C# chỉ trong khoảng một tháng không thể trang trải lambda hoặc regex được nêu ra. Tôi sẽ xem xét các mã này sau này.

+0

'ProperNameMethod' –

+0

@Reza Taibur vui lòng đánh dấu câu trả lời của tôi là được chấp nhận nếu nó giúp bạn. –

+0

Tôi đã thực hiện một phương pháp có thể chuyển đổi từ đầu tiên của chuỗi thành một chữ Block. @ Un-lucky –

Trả lời

2

Bạn có thể muốn case insensitive xác nhận:

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

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

Hoặc nếu bạn xác minh trên văn hóa hiện tại

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

Paranoic trường hợp liên quan đến việc sử dụng biểu thức thông thường như thế này:

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

Tôi thích câu trả lời "trường hợp hoang tưởng" của bạn. Nhưng việc sử dụng chứa có hiệu quả hơn sau đó sử dụng regex. –

+0

@Lost_In_Library: nó phụ thuộc vào những gì bạn muốn đạt được. Trong trường hợp hiệu quả (mảng lớn các từ xấu) và kiểm soát lỏng lẻo, bạn hoàn toàn đúng.Nhưng nếu bạn muốn loại bỏ chỉ là một khả năng thô lỗ, một cái bóng của một từ xấu, bạn phải sử dụng các biểu thức chính quy và những thứ tương tự. –

4

Sử dụng biểu thức lambda sau đây để tìm xem tên có chứa từ xấu không.

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

"p" là gì? @ Mahah Chand? –

+0

p là một bí danh được sử dụng để biểu diễn phần tử riêng lẻ của mảng. –

3

Đây là những gì tôi có thể làm;

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

Tôi cũng đã thử nghiệm các câu trả lời khác nữa;

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

Đây là của tôi đơn giản (& ngu ngốc đang) kiểm tra:

 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, sử dụng đồng hồ bấm giờ là không chính xác. Nhưng nó đưa ra một ý tưởng.

0

Xem xét bạn nói bạn là người mới bắt đầu. Đây là một cách dễ dàng hơn. Tôi biết những câu trả lời là tốt hơn thế này nhưng điều này sẽ tốt cho người mới bắt đầu.

  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(); 
Các vấn đề liên quan