2013-05-17 41 views
5

So sánh "I"chuỗi Weird sắp xếp khi chuỗi thứ 2 dài

string.Compare("î", "I ", StringComparison.CurrentCulture) -- returns -1 
string.Compare("î", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1 
string.Compare("î", "I", StringComparison.CurrentCulture) -- returns 1 (unexpected) 
string.Compare("î", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 1 (unexpected) 

Với "i"

string.Compare("i", "I ", StringComparison.CurrentCulture) -- returns -1 
string.Compare("i", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1 
string.Compare("i", "I", StringComparison.CurrentCulture) -- returns -1 
string.Compare("i", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 0 

văn hóa hiện tại là en-GB. Tôi hy vọng tất cả những điều này sẽ trở lại 1. Tại sao có một chuỗi dài hơn thay đổi thứ tự sắp xếp?

+0

Thực tế - khi tôi sử dụng 'i' không 'î', tôi nhận được kết quả sau: \t \t string.Compare ("i", "I", StringComparison.CurrentCulture) trả về \t -1 string.Compare ("i "," I ", StringComparison.CurrentCulture) -1 \t int –

+0

Cập nhật câu hỏi của bạn với thông tin này. – ChrisF

+0

Bạn đã thử với các nền văn hóa khác chưa? – Simon

Trả lời

9

Xem UTS#10: Unicode Collation Algorithm để biết chi tiết đầy đủ.

Cụ thể, xem phần 1.1 So sánh nhiều cấp giải thích hành vi này.

Có một bảng có thấy một số ví dụ, như thế này một:

role < rôle < roles

Đó là tương tự như ví dụ của bạn với "Tôi", "Tôi" và "I", ví dụ:

"I" < "î" < "I "

trừ khi roless ở cuối, ví dụ của bạn có khoảng trắng ở cuối. Nhưng cùng một logic được áp dụng; nó không liên quan đến những gì nhân vật phụ là - thực tế đơn giản là có một nhân vật phụ làm cho nó sắp xếp SAU "î".

Một điểm quan trọng từ spec là:

khác biệt Accent thường được bỏ qua, nếu các chữ cái cơ sở khác nhau.

Các chữ cái cơ bản khác nhau nếu độ dài khác nhau, vì vậy sự khác biệt trọng âm được bỏ qua trong ví dụ của bạn với khoảng trắng ở cuối.

Tuy nhiên, trong đó các chuỗi có cùng độ dài, sự khác biệt trọng âm là không bị bỏ qua - đó chính là kết quả bạn đang xem.

+2

Câu trả lời này, và trang đó, là lý do tại sao không ai nên viết các cách sắp xếp phân loại/so sánh văn bản của riêng họ khi xử lý các danh sách nhạy cảm về văn hóa. Cấp, có thể có lỗi trong việc thực hiện NET, nhưng tôi sẽ đảm bảo tôi sẽ có lỗi nếu tôi đã viết của riêng tôi. Câu trả lời hay và câu hỏi hay! –

2

Từ Documentation

Việc so sánh chấm dứt khi một sự bất bình đẳng được phát hiện hoặc cả hai chuỗi đã được so sánh. Tuy nhiên, nếu hai chuỗi so sánh bằng kết thúc của một chuỗi và chuỗi còn lại có các ký tự còn lại, thì chuỗi ký tự còn lại được xem là lớn hơn. Giá trị trả về là kết quả của lần so sánh cuối được thực hiện.

+0

string.Compare ("î", "I", StringComparison.CurrentCulture) - trả về 1 string.Compare ("î", "I", StringComparison.CurrentCulture) - trả về -1 Vì vậy - tại sao là î và tôi được coi là bình đẳng? –

+0

Có điều gì đó đặc biệt về "î" - Tôi không hiểu tại sao nó không trả lại 0 nếu nó được coi là bằng 'I', hoặc nếu nó không bằng nhau, thay đổi câu trả lời của nó khi độ dài dài hơn ... –

0

Về cơ bản vì khi sắp xếp chiều dài chuỗi vấn đề

"a" nhỏ hơn "a" phải không? có ý nghĩa.

+0

Có là một cái gì đó đặc biệt về "î" - Tôi không hiểu tại sao nó không trả lại 0 nếu nó được coi là bằng 'I', hoặc nếu nó không bằng nhau, thay đổi câu trả lời của nó khi chiều dài dài hơn ... –

+0

Tại sao " î "so với" I "+1, trong khi" î "so với" I "-1? –

+0

bạn lặp đi lặp lại chính xác giống nhau, bạn có ý nghĩa gì? –

-1

Hành vi lạ, tôi sẽ cung cấp cho bạn điều đó, nhưng tôi không thấy lý do tại sao không sử dụng các so sánh Ordinal cho ngữ cảnh quốc tế được đề cập ở đây.

Để biết thêm thông tin, vui lòng đọc this article.

+0

Các chuỗi được sử dụng để cung cấp thứ tự sắp xếp trong chế độ xem cho một số siêu dữ liệu Âm nhạc. Tôi muốn kết quả là nhạy cảm về mặt văn hóa. Tôi đoán tôi có thể thay đổi nó thành So sánh thông thường ... –

+0

Đối với các màn hình văn bản nhạy cảm văn hóa, so sánh thứ tự và đặt hàng hầu như luôn là lựa chọn sai. –

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