2013-03-03 30 views
16

Tôi thường sẽ sử dụng mã này để so sánh một chuỗi:Chuỗi bình đẳng với xử lý vô

if(!string.IsNullOrEmpty(str1) && str1.Equals(str2)){ 
    //they are equal, do my thing 
} 

này xử lý các trường hợp null đầu tiên, vv

Có cách nào sạch để làm chuỗi so sánh, có lẽ với một cuộc gọi phương thức duy nhất sẽ xử lý các giá trị null có thể có? Tôi chỉ đơn giản muốn biết rằng các chuỗi không bằng nhau nếu giá trị thử nghiệm là null.

(Tôi đang gặp DejaVu mà tôi có thể hỏi này trước đây, tôi xin lỗi nếu có)


Cập nhật: Trong trường hợp của tôi, str2 là một chuỗi tiếng tốt để so sánh với, vì vậy tôi don 't cần phải kiểm tra nó cho null. str1 là chuỗi "không xác định" có thể là rỗng, vì vậy tôi muốn nói "str1 không bằng str2" trong trường hợp str1 null ...

+1

Mã của bạn sai; nó sẽ trả về true nếu 'str1' là null và' str2' thì không. – SLaks

+0

@SLaks Trên thực tế, tôi nghĩ đó là những gì anh ta muốn. Ít nhất dựa trên mô tả –

+0

Tôi có một! trong đó, do đó, nó sẽ chỉ tiếp tục nếu chuỗi để so sánh là KHÔNG null/rỗng. đúng không? –

Trả lời

25

Không giống như Java, chuỗi C# ghi đè toán tử ==:

if (str1 == str2) 

Nếu bạn muốn có một case-insensitive so sánh:

if (String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase) 
+0

Tôi sẽ để nó cho OP, nhưng tôi tin rằng mục tiêu là cũng thất bại nếu một trong hai bên là 'null' –

+1

@JustinPihony' str1 == str2 && str1! = Null' vẫn còn thanh lịch hơn rất nhiều. –

+0

@ p.s.w.g Và, điều đó là tốt, nhưng câu trả lời này không nói điều đó. Ngoài ra, xem câu trả lời của tôi cho một cách để đóng gói này ... như đã nêu, việc đặt tên của phương pháp có thể là khó khăn nhất –

12

Nếu bạn làm không muốn đối xử với hai null chuỗi như tương đương với mỗi ot cô ấy, mã của bạn là tối ưu.

Nếu, mặt khác, bạn muốn để điều trị null giá trị như bằng nhau, bạn có thể sử dụng

object.Equals(str1, str2) 

cho một cách tiếp cận nhiều hơn "đối xứng" mà cũng xử lý null giá trị.

+1

ok, điều này thực sự sẽ làm việc cho tôi như str2 là một giá trị được biết đến và không null. Do đó so sánh null sẽ không thành vấn đề. –

+0

Đây là chức năng hữu ích cần biết. Tuy nhiên, nó không giúp ích trong trường hợp cụ thể của tôi, vì một giá trị rỗng trong đối tượng đầu tiên là null, trong khi một giá trị rỗng trong giá trị thứ hai là một chuỗi rỗng. Nhưng cảm ơn! – CigarDoug

+0

@CigarDoug Với chuỗi C#, không có thứ gì như "giá trị rỗng" là "vô giá trị". Thật không may, họ thường trông giống nhau, gây ra rất nhiều nhầm lẫn. Bạn có thể sửa lỗi này bằng cách sử dụng biểu thức 'object.Equals (str1 ??" ", str2 ??" ")'. – dasblinkenlight

2

Bạn có thể sử dụng mã này

object.Equals(str1, str2) 
3

Không có được xây dựng theo cách để làm điều này, nhưng bạn có thể tạo ra một phương pháp mở rộng để đóng gói này.

public static StringExtensions 
{ 
    public static Boolean IsNotNullAndEquals(this string str1, string str2) 
    { 
     return !string.IsNullOrEmpty(str1) && str1.Equals(str2) 
    } 
} 

sau đó sử dụng nó như thế này:

str1.IsNotNullAndEquals(str2); 

đặt tên sẽ là điều khó khăn nhất của bạn ở đây IMO ... vì bạn cần phải truyền đạt rằng bạn chỉ đang kiểm tra null str1. Khi được sử dụng như là một phương pháp mở rộng, nó đọc khá tốt, nhưng nếu được sử dụng như một tĩnh thường xuyên, thì nó cũng không chuyển tải nó.

+0

Đây là những gì tôi thấy là cần thiết. Đã thực sự tò mò hơn nếu có cái gì đó được xây dựng trong đó sẽ xử lý này, nhưng trông giống như một "không". Cảm ơn! –

+0

thực sự, một phương pháp mở rộng có làm việc cho str1 nếu str1 là null không? Tôi nghĩ rằng nó sẽ bom với một ngoại lệ null –

+0

@boomhauer Đầu tiên, tôi tin như vậy, nhưng sẽ xác minh ngay. Thứ hai, nếu điều này làm việc, một upvote và chấp nhận được đánh giá cao –

6

Tôi biết đây là một vài năm tuổi và tôi nghĩ rằng giải pháp từ dasblinkenlight là chức năng hoàn hảo cho những gì bạn yêu cầu. Tuy nhiên tôi thích mã này vì lý do dễ đọc:

String.Equals(str1, str2)