2012-01-16 69 views
28

Có một hàm tôi có thể áp dụng cho một chuỗi sẽ trả về true false nếu một chuỗi chứa ký tự.Làm cách nào để kiểm tra xem chuỗi có chứa ký tự trong C#?

tôi có các chuỗi với một hoặc nhiều tùy chọn nhân vật như:

var abc = "s"; 
var def = "aB"; 
var ghi = "Sj"; 

Những gì tôi muốn làm ví dụ là có một chức năng mà sẽ trở về đúng hay sai nếu ở trên chứa một chữ thường hoặc trên "S".

if (def.Somefunction("s") == true) { } 

Cũng trong C# tôi có cần kiểm tra xem điều gì đó có đúng như thế này hay tôi có thể xóa "== true"?

Trả lời

67

Bạn có thể sử dụng phương pháp mở rộng .Contains() từ System.Linq namespace:

if (abc.ToLower().Contains('s')) { } 

Và không, để kiểm tra xem một biểu thức boolean là đúng, bạn không cần phải == true

Kể từ khi Contains phương pháp là một phương pháp mở rộng, giải pháp của tôi dường như gây nhầm lẫn cho một số. Dưới đây là hai phiên bản mà không yêu cầu bạn thêm using System.Linq;:

if (abc.ToLower().IndexOf('s') != -1) { } 

// or: 

if (abc.IndexOf("s", StringComparison.CurrentCultureIgnoreCase) != -1) { } 

Cập nhật

Nếu bạn muốn, bạn có thể viết phương pháp mở rộng của riêng bạn để tái sử dụng dễ dàng hơn:

public static class MyStringExtensions 
{ 
    public static bool ContainsAnyCaseInvariant(this string haystack, char needle) 
    { 
     return haystack.IndexOf(needle, StringComparison.InvariantCultureIgnoreCase) != -1; 
    } 

    public static bool ContainsAnyCase(this string haystack, char needle) 
    { 
     return haystack.IndexOf(needle, StringComparison.CurrentCultureIgnoreCase) != -1; 
    } 
} 

Sau đó, bạn có thể gọi nó như sau:

if (def.ContainsAnyCaseInvariant('s')) { } 
// or 
if (def.ContainsAnyCase('s')) { } 

Trong hầu hết các trường hợp khi xử lý dữ liệu người dùng, bạn thực sự muốn sử dụng CurrentCultureIgnoreCase(hoặc phương thức mở rộng ContainsAnyCase), vì cách đó bạn để hệ thống xử lý các vấn đề trên/chữ thường phụ thuộc vào ngôn ngữ. Khi giao dịch với các vấn đề tính toán, như tên của các thẻ HTML và vân vân, bạn muốn sử dụng văn hóa bất biến.

Ví dụ: Trong Thổ Nhĩ Kỳ, các chữ cái viết hoa I trong chữ thường là ı(không có một dấu chấm), và không i(với một dấu chấm).

+9

Hmm, tôi không tìm thấy một tình trạng quá tải của String.Contains mà phải mất một lập luận char. –

+11

@ScottSmith Đây là một phương pháp mở rộng được định nghĩa trong [System.Linq] (http://msdn.microsoft.com/en-us/library/system.linq.enumerable.contains.aspx). Bạn cần phải thêm 'using System.Linq;' – pauloya

+2

Tôi thích sử dụng 'str.IndexOf ('s')> = 0' nhưng nó có lẽ chỉ là một sự khác biệt về phong cách. Nó có ý nghĩa hơn với tôi khi đọc hiểu. – CSS

2
bool containsCharacter = test.IndexOf("s", StringComparison.OrdinalIgnoreCase) >= 0; 
2

Sau đây nên làm việc:

var abc = "sAb"; 
bool exists = abc.IndexOf("ab", StringComparison.CurrentCultureIgnoreCase) > -1; 
2

Sử dụng String.Contains function();

cuộc gọi Ví dụ,

abs.Contains("s"); // to look for lower case s 

here là nhiều hơn từ MSDN.

+1

Điều này không trả lời câu hỏi OPs - họ muốn biết liệu có chữ hoa hay chữ thường hay không - giải pháp của bạn sẽ chỉ đánh giá đúng nếu chữ thường "s" nằm trong chuỗi. –

8

Bạn có thể sử dụng phương pháp IndexOf, trong đó có một tình trạng quá tải phù hợp với nhiều loại chuỗi so sánh:

if (def.IndexOf("s", StringComparison.OrdinalIgnoreCase) >= 0) ... 

Ngoài ra, bạn sẽ không cần == true, vì một câu lệnh if chỉ hy vọng một biểu thức để đánh giá một bool .

3

Sẽ rất khó để làm việc trong C# mà không biết cách làm việc với chuỗi và boolean. Nhưng dù sao:

 String str = "ABC"; 
     if (str.Contains('A')) 
     { 
      //... 
     } 

     if (str.Contains("AB")) 
     { 
      //... 
     } 
+3

MSDN không liệt kê một phương thức chứa chấp nhận một ký tự, như trong ví dụ đầu tiên của bạn. Để có được cú pháp đó, bạn cần sử dụng LINQ hoặc viết phần mở rộng của riêng bạn. –

0

đây là một ví dụ những gì hầu hết đã làm

using System; 

class Program 
{ 
    static void Main() 
    { 
     Test("Dot Net Perls"); 
     Test("dot net perls"); 
    } 

    static void Test(string input) 
    { 
     Console.Write("--- "); 
     Console.Write(input); 
     Console.WriteLine(" ---"); 
     // 
     // See if the string contains 'Net' 
     // 
     bool contains = input.Contains("Net"); 
     // 
     // Write the result 
     // 
     Console.Write("Contains 'Net': "); 
     Console.WriteLine(contains); 
     // 
     // See if the string contains 'perls' lowercase 
     // 
     if (input.Contains("perls")) 
     { 
      Console.WriteLine("Contains 'perls'"); 
     } 
     // 
     // See if the string contains 'Dot' 
     // 
     if (!input.Contains("Dot")) 
     { 
      Console.WriteLine("Doesn't Contain 'Dot'"); 
     } 
    } 
} 
2

Bạn có thể tạo phương pháp gia hạn của riêng bạn nếu bạn có kế hoạch để sử dụng này rất nhiều.

public static class StringExt 
{ 
    public static bool ContainsInvariant(this string sourceString, string filter) 
    { 
     return sourceString.ToLowerInvariant().Contains(filter); 
    } 
} 

ví dụ sử dụng:

public class test 
{ 
    public bool Foo() 
    { 
     const string def = "aB"; 
     return def.ContainsInvariant("s"); 
    } 
} 
Các vấn đề liên quan