2010-05-01 48 views
133

Đó sẽ là mã tốt hơn:So sánh chuỗi: InvariantCultureIgnoreCase vs OrdinalIgnoreCase?

int index = fileName.LastIndexOf(".", StringComparison.InvariantCultureIgnoreCase); 

hoặc

int index = fileName.LastIndexOf(".", StringComparison.OrdinalIgnoreCase); 
+8

điều đó sẽ phụ thuộc vào những gì bạn đang cố gắng đạt được ... –

+0

@MartinLiversage đánh dấu C# câu hỏi là trùng lặp với câu hỏi vb.net .. hài hước ít nhất. Tin rằng cả hai nên chia sẻ. Net tag trong trường hợp này – Lanorkin

+0

@Lanorkin: Sự khác biệt giữa hai giá trị enum là giống nhau trong VB.NET và C# và không có câu trả lời cho cả hai câu hỏi này và khác là cụ thể cho một trong hai VB.NET hoặc C#. Hai câu hỏi rõ ràng là trùng lặp và bằng cách kết hợp chúng như tôi đã làm nó trở nên dễ dàng hơn để tìm thông tin liên quan về các giá trị enum này. –

Trả lời

33

Nếu bạn thực sự muốn chỉ khớp với dấu chấm, thì CultureInfo.Ordinal sẽ nhanh nhất, vì không có sự khác biệt về chữ hoa.

44

FxCop thường thích OrdinalIgnoreCase. Nhưng yêu cầu của bạn có thể thay đổi.

Đối với tiếng Anh, có rất ít sự khác biệt. Đó là khi bạn đi lang thang vào các ngôn ngữ có cấu trúc ngôn ngữ viết khác nhau mà điều này trở thành một vấn đề. Tôi không đủ kinh nghiệm để cung cấp cho bạn nhiều hơn thế.

OrdinalIgnoreCase

Các StringComparer trả về bởi các xử lý OrdinalIgnoreCase tài sản các nhân vật trong chuỗi để so sánh, nếu như họ được cải chữ hoa bằng cách sử dụng công ước của nền văn hóa bất biến, và sau đó Thực hiện so sánh byte đơn giản độc lập với ngôn ngữ. Điều này phù hợp nhất khi so sánh các chuỗi được tạo ra theo lập trình hoặc khi so sánh tài nguyên không phân biệt dạng chữ như đường dẫn và tên tệp. http://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase.aspx

InvariantCultureIgnoreCase

Các StringComparer trả về bởi các InvariantCultureIgnoreCase tài sản so sánh chuỗi trong một cách ngôn ngữ có liên quan mà bỏ qua trường hợp, nhưng nó không phải là thích hợp để trưng bày trong bất kỳ nền văn hóa đặc biệt . Ứng dụng chính của nó là đặt các chuỗi theo cách giống hệt nhau trên các nền văn hóa . http://msdn.microsoft.com/en-us/library/system.stringcomparer.invariantcultureignorecase.aspx

Văn bản bất biến là đối tượng CultureInfo đối tượng CultureInfo được trả về bởi thuộc tính bất biến .

Thuộc tính InvariantCultureIgnoreCase thực sự trả về một cá thể của một lớp ẩn danh bắt nguồn từ lớp StringComparer.

193

Không có mã nào luôn tốt hơn. Họ làm những việc khác nhau, vì vậy họ giỏi những thứ khác nhau.

InvariantCultureIgnoreCase sử dụng các quy tắc so sánh dựa trên tiếng Anh, nhưng không có bất kỳ biến thể khu vực nào. Điều này là tốt cho một so sánh trung lập mà vẫn đưa vào tài khoản một số khía cạnh ngôn ngữ.

OrdinalIgnoreCase so sánh mã ký tự không có khía cạnh văn hóa. Điều này là tốt cho các so sánh chính xác, như tên đăng nhập, nhưng không phải để sắp xếp các chuỗi có các ký tự không bình thường như é hoặc ö. Điều này cũng nhanh hơn vì không có quy tắc bổ sung để áp dụng trước khi so sánh.

+3

cách 'InvariantCultureIgnoreCase' hoạt động khi anh ta gặp 'ä'? ngược lại với 'OrdinalIgnoreCase' ...? –

+1

@RoyiNamir: Văn hóa bất biến dựa trên tiếng Anh, vì vậy nó sẽ xử lý 'ä',' à', 'å', et.c. như 'a', tức là xóa dấu phụ. Sử dụng một nền văn hóa thứ tự sẽ đặt các ký tự có dấu phụ sau tất cả các chữ cái thông thường, tức là được sắp xếp nghiêm ngặt trên mã ký tự. – Guffa

+0

bạn có nghĩa là tất cả chúng sẽ là chữ hoa A (InvariantCultureIgnoreCase) phải không? –

14

Bạn dường như đang làm so sánh tên file, vì vậy tôi sẽ chỉ cần thêm rằng OrdinalIgnoreCasegần những gì NTFS không (nó không giống hệt nhau, nhưng nó gần hơn InvariantCultureIgnoreCase)

+2

Bạn có tham khảo về NTFS không? – Basic