it-swarm-vi.tech

Cái nào thường tốt nhất để sử dụng - StringComparison.OrdinalIgnoreCase hoặc StringComparison.InvariantCARMIgnoreCase?

Tôi có một số mã như thế này:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

Tôi không quan tâm đến vụ án. Tôi nên sử dụng OrdinalIgnoreCase, InvariantCultureIgnoreCase hay CurrentCultureIgnoreCase?

141
Dave Haynes

Tài liệu .Net mới hơn hiện có một bảng để giúp bạn quyết định sử dụng cái nào là tốt nhất trong tình huống của bạn.

Từ " Khuyến nghị mới về sử dụng chuỗi trong Microsoft .NET 2. "

Tóm tắt: Chủ sở hữu mã trước đây sử dụng InvariantCulture để so sánh chuỗi, vỏ và sắp xếp nên cân nhắc mạnh mẽ khi sử dụng một bộ quá tải String mới trong Microsoft .NET 2.0. Cụ thể, dữ liệu được thiết kế không liên quan đến văn hóa và ngôn ngữ không liên quan nên bắt đầu chỉ định quá tải bằng cách sử dụng StringComparison.Ordinal hoặc là StringComparison.OrdinalIgnoreCase thành viên của StringComparison liệt kê mới. Chúng thực thi so sánh từng byte tương tự như strcmp không chỉ tránh các lỗi từ việc giải thích ngôn ngữ của các chuỗi ký hiệu cơ bản, mà còn cung cấp hiệu suất tốt hơn.

156
Robert Taylor

Tất cả phụ thuộc vào

So sánh các chuỗi unicode là khó:

Việc thực hiện tìm kiếm và so sánh chuỗi Unicode trong phần mềm xử lý văn bản phải tính đến sự hiện diện của các điểm mã tương đương. Trong trường hợp không có tính năng này, người dùng đang tìm kiếm một chuỗi điểm mã cụ thể sẽ không thể tìm thấy các glyph không thể phân biệt trực quan khác có biểu diễn điểm mã khác, nhưng tương đương về mặt quy tắc.

xem: http://en.wikipedia.org/wiki/Unicode_equivalence


Nếu bạn đang cố gắng so sánh 2 chuỗi unicode theo cách không phân biệt chữ hoa chữ thường và muốn nó hoạt động [~ # ~] ở mọi nơi [~ # ~] , bạn có một vấn đề không thể.

Ví dụ kinh điển là tiếng Thổ Nhĩ Kỳ i , khi chữ hoa trở thành chữ (chú ý dấu chấm)

Theo mặc định, khung .Net thường sử dụng CurrentCARM cho các hàm liên quan đến chuỗi, ngoại trừ rất quan trọng là .Equals sử dụng so sánh thứ tự (byte theo byte).

Điều này dẫn, theo thiết kế, đến các hàm chuỗi khác nhau hoạt động khác nhau tùy thuộc vào văn hóa của máy tính.


Tuy nhiên, đôi khi chúng tôi muốn một "mục đích chung", trường hợp không nhạy cảm, so sánh.

Ví dụ, bạn có thể muốn so sánh chuỗi của mình hoạt động theo cùng một cách, bất kể ứng dụng của bạn được cài đặt trên máy tính nào.

Để đạt được điều này, chúng tôi có 3 lựa chọn:

  1. Đặt văn hóa rõ ràng và thực hiện so sánh không phân biệt chữ hoa chữ thường bằng các quy tắc tương đương unicode.
  2. Đặt văn hóa thành Văn hóa bất biến và thực hiện so sánh không phân biệt chữ hoa chữ thường bằng các quy tắc tương đương unicode.
  3. Sử dụng OrdinalIgnoreCase sẽ viết hoa chuỗi bằng InvariantCARM và sau đó thực hiện một byte bằng cách so sánh byte.

Các quy tắc tương đương Unicode rất phức tạp, có nghĩa là sử dụng phương pháp 1) hoặc 2) đắt hơn OrdinalIgnoreCase. Thực tế là OrdinalIgnoreCase không thực hiện bất kỳ chuẩn hóa unicode đặc biệt nào, có nghĩa là một số chuỗi kết xuất theo cùng một cách trên màn hình máy tính, sẽ không được coi là giống hệt nhau. Ví dụ: "\u0061\u030a""\u00e5" cả hai kết xuất å. Tuy nhiên trong một so sánh thứ tự sẽ được coi là khác nhau.

Mà bạn chọn rất nhiều phụ thuộc vào ứng dụng bạn đang xây dựng.

  • Nếu tôi đang viết một ứng dụng dành cho doanh nghiệp chỉ được sử dụng bởi người dùng Thổ Nhĩ Kỳ, tôi chắc chắn sẽ sử dụng phương pháp 1.
  • Nếu tôi chỉ cần một so sánh không nhạy cảm trường hợp "giả" đơn giản, ví dụ như một tên cột trong db, thường là tiếng Anh, tôi có thể sẽ sử dụng phương thức 3.

Microsoft có bộ khuyến nghị với hướng dẫn rõ ràng. Tuy nhiên, điều thực sự quan trọng là phải hiểu khái niệm tương đương unicode trước khi tiếp cận những vấn đề này.

Ngoài ra, xin lưu ý rằng OrdinalIgnoreCase là một loại rất đặc biệt của quái thú, đó là chọn và chọn một chút so sánh thông thường với một số khía cạnh từ vựng. Điều này có thể gây nhầm lẫn.

57
Sam Saffron

MSDN đưa ra một số khuyến nghị khá rõ ràng về điều này: http://msdn.Microsoft.com/en-us/l Library/ms973919.aspx

8
chessguy

Tôi đoán nó phụ thuộc vào tình hình của bạn. Vì các so sánh thứ tự thực sự đang xem xét các giá trị Unicode số của các ký tự, chúng sẽ không phải là lựa chọn tốt nhất khi bạn sắp xếp theo thứ tự bảng chữ cái. Tuy nhiên, để so sánh chuỗi, thứ tự sẽ nhanh hơn một chút.

3
Bullines

Nó phụ thuộc vào những gì bạn muốn, mặc dù tôi rất ngại bất biến trừ khi bạn rất chắc chắn bạn sẽ không bao giờ muốn bản địa hóa mã cho các ngôn ngữ khác. Sử dụng CurrentCARM thay thế.

Ngoài ra, OrdinalIgnoreCase nên tôn trọng các con số, có thể hoặc không thể là những gì bạn muốn.

1
Joel Coehoorn

Câu trả lời rất đơn giản là, trừ khi bạn đang sử dụng tiếng Thổ Nhĩ Kỳ, bạn không cần sử dụng InvariantCARM.

Xem liên kết sau:

Trong C #, sự khác biệt giữa ToUpper () và ToUpperInvariant ()?

0
TheMoot