2009-09-01 40 views
10

Các hàm chuỗi .NET có giống như IndexOf("blah") phân biệt chữ hoa chữ thường không?Trường hợp hoạt động chuỗi .NET có nhạy cảm không?

Từ những gì tôi nhớ là không, nhưng vì lý do nào đó, tôi thấy lỗi trong ứng dụng của tôi nơi chuỗi văn bản trong chuỗi truy vấn nằm trong trường hợp lạc đà (như UserID) và tôi đang thử nghiệm IndexOf("userid").

Trả lời

21

Có, các hàm chuỗi phân biệt chữ hoa chữ thường theo mặc định. Chúng thường có quá tải cho phép bạn chỉ ra loại so sánh chuỗi mà bạn muốn. Điều này cũng đúng đối với IndexOf. Để nhận chỉ mục chuỗi của bạn, theo cách phân biệt chữ hoa chữ thường, bạn có thể làm:

string blaBlah = "blaBlah"; 
int idx = blaBlah.IndexOf("blah", StringComparison.OrdinalIgnoreCase); 
+1

C# là trường hợp stricly nhạy cảm, nhưng trong VB.NET, bạn có thể sử dụng TÙY CHỌN TÙY CHỌN TÙY CHỌN để bắt buộc so sánh không phân biệt chữ hoa chữ thường. Mặc định trong VB.NET là BINARY vì vậy nó hoạt động như C#. –

+1

Mặc dù vậy, 'So sánh tùy chọn' chỉ áp dụng cho các toán tử so sánh VB như' = 'và' Like' - nó sẽ không ảnh hưởng đến bất kỳ phương thức 'Chuỗi' nào, cũng như các hàm chuỗi FCL khác. –

1

So sánh chuỗi thực sự là trường hợp nhạy cảm. Bạn có thể sử dụng những thứ như ToUpper() để bình thường hóa mọi thứ trước khi so sánh chúng.

+0

Một tùy chọn khác sẽ là: CultureInfo.CurrentCulture.CompareInfo.IndexOf (nguồn, giá trị, CompareOptions.IgnoreCase) –

+0

Hãy cẩn thận về văn hóa, hoặc bạn đột nhiên có thể tìm thấy so sánh không hoạt động trên hệ thống Thổ Nhĩ Kỳ - ở Thổ Nhĩ Kỳ, i uppercases to İ. –

+3

bằng cách sử dụng ToUpper hoặc ToLower là một ý tưởng tồi vì nó sẽ yêu cầu khởi tạo đối tượng mới (xấu cho hiệu suất) tất cả các phương thức so sánh chuỗi hoặc lấy đối số StringComparison hoặc đối số IComparer trong một trong các quá tải sử dụng một trong số đó sẽ thực hiện ToUpper/ToLower –

0

Mặc định chúng phân biệt chữ hoa chữ thường nhưng hầu hết trong số chúng (nếu không phải tất cả) bao gồm IndexOf có quá tải phải mất đối số StringComparison. Ví dụ. nếu bạn vượt qua

StringComparison.InvariantCultureIgnoreCase 

như là đối số StringComparison để indexOf nó sẽ (như tên của nó) bỏ qua phân biệt hoa thường

11

Một điều tôi muốn thêm vào các câu trả lời hiện có (kể từ khi bạn đã ban hỏi về ASP.NET):

Một số bộ sưu tập tên/giá trị, chẳng hạn như Request.QueryString và có thể cả Request.Form không phân biệt chữ hoa chữ thường. Ví dụ nếu tôi hướng đến một trang ASPX sử dụng URL sau

http://server/mypage.aspx?user=admin 

sau đó cả hai dòng sau sẽ trở lại "admin":

var user1 = Request.QueryString["user"]; 
var user2 = Request.QueryString["USER"]; 
Các vấn đề liên quan