2015-09-23 15 views
11

Trong Best Practices for Using Strings in the .NET Framework, StringComparison OrdinalIgnoreCase được đề xuất cho đường dẫn tệp phân biệt chữ hoa chữ thường. (Hãy gọi nó là Bản Tuyên Bố A.)ToUpperInvariant() - là MSDN sai về đề xuất của nó?

tôi có thể đồng ý với điều đó, vì tôi có thể tạo ra hai tập tin trong cùng thư mục:

é.txt 
é.txt 

tên tập tin của họ không giống nhau, thứ hai bao gồm từ e và sửa đổi, do đó, nó thực sự có hai chữ cái. (Bạn có thể tự thử bằng cách sử dụng sao chép-dán.)

Nếu có sự so sánh văn hóa bất biến (và không so sánh thứ tự), NTFS sẽ không cho phép các tệp này, vì trong cùng một bài viết chúng giải thích, trong văn hóa bất biến a + ̊ = å

Nhưng trong bài viết trên String.ToUpperInvariant() có khuyến cáo khác nhau: (Statement B.)

Nếu bạn cần chữ thường hoặc chữ hoa phiên bản của một định danh hệ điều hành, chẳng hạn như một tên tập tin, tên đường ống, hoặc khóa đăng ký, sử dụng các phương thức ToLowerInvariant hoặc ToUpperInvariant.

Tôi cần tạo bộ sưu tập đường dẫn tệp (trên thực tế HashSet) để phát hiện trùng lặp. Vì vậy, nếu tôi sẽ tuân theo tuyên bố B khi tạo bản đồ, tôi có thể kết thúc với các mặt tích cực sai, vì các tên tệp nêu trên é.txté.txt sẽ được coi là một. Tôi hiểu nó đúng cách mà phát hiện B được tìm thấy trong MSDN có gây nhầm lẫn không? Hay tôi đang thiếu một cái gì đó?

Tôi sắp xây dựng một thư viện, tốt nhất là không có lỗi đã biết, chúng tôi không muốn bỏ qua điều này.

Cập nhật:

Tuyên bố B dường như có một vấn đề nữa: ToLowerInvariant() không thể thực sự được sử dụng. Lý do (Tôi trích dẫn Bài viết thực hành tốt nhất): DO: Use ToUpperInvariant rather than ToLowerInvariant when normalizing strings for comparison. Lý do thực sự: There is a small range of characters that do not roundtrip, and going to lowercase will make these characters unavailable. (source)

+3

Tôi không hoàn toàn chắc chắn "phiên bản chữ thường hoặc chữ hoa của số nhận dạng hệ điều hành" có nghĩa là "ánh xạ rõ ràng của số nhận dạng hệ điều hành đối với phiên bản chữ thường hoặc chữ hoa". Nó cũng có thể có nghĩa là "ánh xạ của một định danh hệ điều hành cho một phiên bản chữ hoa hoặc chữ thường không phải là duy nhất sẽ hoạt động theo cùng một cách bất kể ngôn ngữ của hệ thống". –

+0

OT, nhưng ai biết thư viện của bạn làm gì: NTFS cũng cho phép ':', '*' hoặc '?' Trong tên tệp. Nó chỉ là Windows không hỗ trợ nó. Nó khá dễ dàng để tạo ra các tập tin trên NTFS dưới Linux. –

+0

@ O.R.Mapper - một cách hay để đọc câu lệnh đó ... Trong ngữ cảnh này có vẻ logic. Mặt khác, họ có thể bỏ qua đề cập đến tên tập tin hoặc thêm một lưu ý ngắn về (không) độc đáo. – miroxlav

Trả lời

5

Không được viết hoa hay viết tắt là chính xác khi bạn muốn so sánh các chuỗi cho trường hợp bình đẳng vô cảm. Trong cả hai biến thể có những nhân vật gây rối loạn này.

Cách đúng để so sánh chuỗi phân biệt chữ hoa chữ thường là sử dụng một trong các tùy chọn không nhạy cảm StringComparison (bạn biết điều đó).

Cách đúng để sử dụng cấu trúc dữ liệu phân biệt chữ hoa chữ thường là sử dụng một trong số StringComparer.*IgnoreCase. Ví dụ:

new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) 

Do không chuỗi chữ hoa trước khi thêm chúng vào một cấu trúc dữ liệu. Tôi sẽ thất bại trong bất kỳ đánh giá mã nào.

Nếu bạn cần chữ thường hoặc chữ hoa phiên bản của một hệ điều hành nhận dạng

Bạn không cần phải như điều. Tuyên bố này không áp dụng cho trường hợp của bạn.

+0

Vì vậy, trong trường hợp tên tệp NTFS, điều này có nghĩa là 'mới HashSet (StringComparer.OrdinalIgnoreCase) '(hoặc chỉ' OrdinalCase', tùy thuộc vào độ nhạy trường hợp NTFS được chuyển trong trường hợp cụ thể). – miroxlav

+0

Tôi không biết loại so sánh nào sử dụng NTFS. Nó có thể được cấu hình. Có một tệp ẩn trên mỗi ổ đĩa NTFS lưu trữ bảng ánh xạ trường hợp Unicode. Tôi đoán nó có thể tùy ý. Không chắc nó là gì trong thực tế. – usr

+0

Vâng tôi biết rằng ... Nó có nghĩa là chúng ta thực sự có thể cần một cái gì đó như so sánh 'NtfsIgnoreCase', làm việc dựa trên nội dung của tập tin' $ UpCase' ẩn đó: – miroxlav

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