2009-03-10 19 views
131

Tôi biết rằng đây là trường hợp nhạy cảm:Có toán tử đẳng số không phân biệt chữ hoa chữ thường không?

if (StringA == StringB) { 

Vậy là có một nhà điều hành mà sẽ so sánh hai chuỗi một cách vô cảm?

+0

thể trùng lặp của [Caselessly so sánh chuỗi trong C#] (http://stackoverflow.com/questions/501906/caselessly-comparing-strings-in-c-sharp) – nawfal

+0

Trong trường hợp ai đó tình cờ gặp câu hỏi này tìm kiếm một so sánh không phân biệt chữ hoa chữ thường cho một từ điển , hãy xem câu hỏi này ở đây: [Truy cập phân biệt chữ hoa chữ thường cho từ điển chung] (http://stackoverflow.com/questions/13230414/case-insensitive-access-for-generic-dic tionary) – Robotnik

+0

Nó sẽ thực sự tốt đẹp; nói để xác định một '~ =' tương ứng thành song song '==' như một phiên bản không phân biệt chữ hoa chữ thường. – eidylon

Trả lời

240

Hãy thử điều này:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase); 
+0

Tôi là người mới StackOverflow tương đối - bạn có thể giải thích ý bạn bằng cách thêm liên kết không? Bạn có ý nghĩa với các tài liệu MSDN? –

+0

gosh bạn đang nhanh chóng .. lol Tôi đã gõ câu trả lời bạn đã cho tôi đầu tiên = D – Erick

+0

Bạn có thể thêm một liên kết MSDN (mà tôi thường làm) hoặc nếu bạn tìm thấy bất kỳ bài đăng trên blog thú vị hoặc có thể mở rộng câu trả lời. – Samuel

14
System.Collections.CaseInsensitiveComparer 

hoặc

System.StringComparer.OrdinalIgnoreCase 
+0

Điều này có ảnh hưởng đến toàn bộ ứng dụng không? – GateKiller

+0

Không, chỉ khi bạn sử dụng. – leppie

+2

Tôi có thể tìm thêm thông tin về điều này ở đâu. Điều này có nghĩa là tôi có thể sử dụng == cho một trường hợp không khớp không? – GateKiller

3

điều hành? KHÔNG, nhưng tôi nghĩ bạn có thể thay đổi văn hóa của bạn để so sánh chuỗi không phân biệt chữ hoa chữ thường.

// you'll want to change this... 
System.Threading.Thread.CurrentThread.CurrentCulture 
// and you'll want to custimize this 
System.Globalization.CultureInfo.CompareInfo 

Tôi tin rằng nó sẽ thay đổi cách chuỗi được so sánh bởi toán tử bằng.

+4

Đó là một chút imho hack imho ... –

+0

Vâng, để nói rằng ít nhất nó hoàn toàn không phải những gì bạn sẽ muốn làm trừ khi bạn muốn tất cả các so sánh chuỗi được trường hợp không nhạy cảm. Nhưng tôi nghĩ nó thay đổi hành vi của toán tử bằng. –

9
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase); 
0
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) { 

dân báo cáo ToUpperInvariant() là nhanh hơn so với ToLowerInvariant().

+1

Bất biến có thể là một ý tưởng tồi nếu văn hóa hiện tại hoặc mong muốn có các quy tắc đặc biệt cho lớp vỏ trên. – OregonGhost

+0

Và ngữ nghĩa cũng khác nhau. – leppie

+0

Điều này có tạo bản sao mới của mỗi chuỗi không? Nếu vậy, ý tưởng tồi. – cjk

3

Bạn có thể sử dụng

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase)) 
7

hoặc

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) { 

nhưng bạn cần phải chắc chắn rằng StringA không phải là null. Vì vậy, có lẽ tốt hơn tu sử dụng:

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase); 

như John đề nghị

EDIT: sửa chữa các lỗi

0
string.Compare(string1, string2, true) 
+1

Điều này có thể gặp sự cố I18N. –

16

Có một số tài sản trên lớp tĩnh StringComparer mà trở về Người đối chiếu cho bất kỳ loại phân biệt chữ hoa chữ thường bạn có thể muốn:

StringComparer Properties

Ví dụ, bạn có thể gọi

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2) 

hoặc

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2) 

Đó là một chút sạch hơn string.Equals hoặc string.Compare quá tải mà phải mất một lập luận StringComparison.

2

Tôi quá quen với gõ vào cuối những phương pháp so sánh: , StringComparison.

Vì vậy, tôi đã thực hiện một phần mở rộng.

namespace System 
{ public static class StringExtension 
    { 
     public static bool Equals(this string thisString, string compareString, 
      StringComparison stringComparison) 
     { 
      return string.Equals(thisString, compareString, stringComparison); 
     } 
    } 
} 

Chỉ cần lưu ý rằng bạn sẽ cần phải kiểm tra cho null trên thisString trước khi gọi các ext.

18

Cách tốt nhất để so sánh 2 chuỗi bỏ qua trường hợp của các chữ cái là sử dụng phương pháp tĩnh String.Equals chỉ định so sánh chuỗi trường hợp bỏ qua thứ tự. Đây cũng là cách nhanh nhất, nhanh hơn nhiều so với việc chuyển đổi chuỗi thành chữ thường hoặc chữ hoa và so sánh chúng sau đó.

Tôi đã thử nghiệm hiệu suất của cả hai phương pháp tiếp cận và so sánh chuỗi trường hợp bỏ qua thứ tự là nhanh hơn 9 lần! Nó cũng đáng tin cậy hơn so với việc chuyển đổi chuỗi thành chữ thường hoặc chữ hoa (kiểm tra vấn đề tiếng Thổ Nhĩ Kỳ). Vì vậy, luôn luôn sử dụng phương pháp String.Equals để so sánh chuỗi sự bình đẳng:

String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase); 

Nếu bạn muốn thực hiện một nền văn hóa cụ thể so sánh chuỗi, bạn có thể sử dụng đoạn mã sau:

String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase); 

Xin lưu ý rằng việc sử dụng ví dụ thứ hai logic so sánh chuỗi của văn hóa hiện tại, làm cho nó chậm hơn so sánh "trường hợp bỏ qua thứ tự" trong ví dụ đầu tiên, vì vậy nếu bạn không cần bất kỳ chuỗi so sánh chuỗi văn hóa cụ thể nào và bạn đang đạt hiệu suất tối đa, hãy sử dụng " trường hợp bỏ qua thứ tự "so sánh.

Để biết thêm thông tin, read the full story on my blog.

+0

Không đề xuất 'ToLower' hoặc' ToLowerInvariant': chúng tạo bộ nhớ chỉ để thực hiện so sánh và chúng có thể thất bại khi các bộ ký tự mới được thêm vào unicode. 'ToUpper' thất bại vì chữ 'i' của Thổ Nhĩ Kỳ, trong số những thứ khác; không có lý do tại sao 'ToLower' sẽ không thất bại trong tương lai vì những lý do tương tự. – antiduh

+0

@antiduh, cảm ơn bạn đã bình luận của bạn. Hầu hết chúng ta đều nhận thức được những vấn đề tiềm ẩn này, nhiều hướng dẫn trên Internet cung cấp cho ví dụ 'i' của Thổ Nhĩ Kỳ. Như bạn thấy trong bài viết của tôi, tôi không khuyên bạn sử dụng phương thức 'ToLower' hoặc' ToLowerInvariant', tôi chỉ muốn hiển thị phương thức 'String.Equals' hiệu quả hơn bao nhiêu. –

+3

"Hầu hết chúng ta đều nhận thức được những vấn đề tiềm năng này, nhiều hướng dẫn trên Internet cung cấp cho 'i' của Thổ Nhĩ Kỳ làm ví dụ" - không đủ người, và bạn vẫn đề cập đến nó như câu thứ hai trong câu trả lời của bạn. Hơn nữa, câu trả lời * của bạn * không bao gồm đủ lý giải để không bao giờ sử dụng nó - bạn chỉ đơn giản đề cập đến hiệu suất; hiệu suất không phải lúc nào cũng là ưu tiên hàng đầu. Do đó, bạn hiện đang vi phạm nguyên tắc của trung tâm trợ giúp; liên kết đến các trang web bên ngoài là tốt, nhưng bạn đã không tóm tắt nội dung đầy đủ (vấn đề 'i' của Thổ Nhĩ Kỳ). SO không phải là nền tảng quảng cáo của bạn. – antiduh

0

Câu trả lời khác hoàn toàn hợp lệ tại đây, nhưng bằng cách nào đó phải mất một chút thời gian để nhập StringComparison.OrdinalIgnoreCase và cũng sử dụng String.Compare.

Tôi đã được mã hóa phương pháp Chuỗi mở rộng đơn giản, nơi bạn có thể chỉ định nếu so sánh là trường hợp nhạy cảm hoặc trường hợp vô nghĩa với boolean - xem câu trả lời sau đây:

https://stackoverflow.com/a/49208128/2338477

Các vấn đề liên quan