2008-10-09 40 views
19

Nếu tôi muốn có một chuỗi có khóa từ điển case-insensitive, phiên bản StringComparer nên tôi sử dụng cho những khó khăn này:phiên bản nào của StringComparer sử dụng

  • Các phím có trong từ điển đến từ một trong hai mã C# hoặc các tập tin cấu hình viết bằng tiếng Anh bản địa chỉ (hoặc Mỹ hoặc Anh)
  • phần mềm này là quốc tế hóa và sẽ chạy ở địa phương khác nhau

tôi thường sử dụng StringComparer.InvariantCultureIgnoreCase nhưng không chắc chắn nếu đó là đúng trường hợp. Đây là mã ví dụ:

Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase); 

Trả lời

11

This MSDN article bao gồm tất cả mọi thứ bạn có thể muốn biết một cách sâu sắc, trong đó có vấn đề Thổ Nhĩ Kỳ-I.

Đã một thời gian kể từ khi tôi đọc nó, vì vậy tôi sẽ làm lại như vậy. Hẹn gặp lại sau một giờ!

1

Vì các khóa là giá trị cố định đã biết của bạn nên InvariantCultureIgnoreCase hoặc OrdinalIgnoreCase sẽ hoạt động. Tránh một văn hóa cụ thể, hoặc bạn có thể nhấn một số trong những điều "vui vẻ" hơn như "Thổ Nhĩ Kỳ i" vấn đề. Rõ ràng, bạn sẽ sử dụng một so sánh văn hóa nếu bạn so sánh các giá trị văn hóa ... nhưng nó có vẻ như bạn không.

3

Khái niệm "phân biệt chữ hoa chữ thường" là một ngôn ngữ, và do đó không có ý nghĩa nếu không có văn hóa.

Xem điều này blog để biết thêm thông tin.

Điều đó nói rằng nếu bạn chỉ đang nói về các chuỗi bằng cách sử dụng bảng chữ cái Latinh thì có thể bạn sẽ nhận được ngay với InvariantCulture.

Mặc dù vậy, tốt nhất bạn nên tạo từ điển bằng StringComparer.CurrentCulture. Điều này sẽ cho phép "ß" khớp với "ss" trong từ điển của bạn trong một nền văn hóa Đức, ví dụ.

1

StringComparer.OrdinalIgnoreCase là hơi nhanh hơn InvariantCultureIgnoreCase FWIW ("Một so sánh thứ tự là nhanh, nhưng văn hóa-insensitive" theo MSDN.

Bạn sẽ phải được thực hiện rất nhiều sự so sánh để thấy sự khác biệt của Tất nhiên.

0

Văn hóa bất biến tồn tại đặc biệt để đối phó với chuỗi được nội bộ để chương trình và không có gì để làm với dữ liệu người dùng hoặc UI. nghe có vẻ như đây là trường hợp cho tình trạng này.

27

có ba các loại so sánh:

  • Văn hóa-aware
  • Văn hóa bất biến
  • TT

Mỗi Comparer có cũng như một phiên bản case-sensitive case-insensitive.

An thứ tự trình so sánh sử dụng giá trị thứ tự của các ký tự. Đây là bộ so sánh nhanh nhất, nó nên được sử dụng cho mục đích nội bộ.

A nhận biết văn hóa trình so sánh xem xét các khía cạnh cụ thể cho văn hóa của chuỗi hiện tại. Nó biết "tiếng Thổ Nhĩ Kỳ", "tiếng Tây Ban Nha LL", v.v. Nó nên được sử dụng cho các chuỗi giao diện người dùng.

Các bất thường văn hóa bất biến văn hóa so sánh thực sự không được xác định và có thể tạo ra kết quả không thể đoán trước và do đó không bao giờ được sử dụng.

Tài liệu tham khảo

  1. New Recommendations for Using Strings in Microsoft .NET 2.0
+0

đẹp và ngọt ngào. Một trường hợp tôi thích văn hóa bất biến hơn là khi nào nhìn vào db .. – nawfal

0

System.Collections.Specialized bao gồm StringDictionary. Phần Ghi chú của MSDN cho biết "Một khóa không thể là rỗng, nhưng một giá trị có thể.

Khóa được xử lý theo cách không phân biệt chữ hoa chữ thường, được dịch sang chữ thường trước khi nó được sử dụng với từ điển chuỗi"

Trong .NET Framework phiên bản 1.0, lớp này sử dụng so sánh chuỗi văn hóa nhạy cảm.Tuy nhiên, trong .NET Framework phiên bản 1.1 trở lên, lớp này sử dụng CultureInfo.InvariantCulture khi so sánh các chuỗi. xem So sánh và sắp xếp dữ liệu cho một hoạt động chuỗi văn hóa cụ thể và hoạt động không nhạy cảm về văn hóa cụ thể

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