2013-02-19 40 views
16

Tôi có một câu hỏi liên quan đến so sánh chuỗi so với so sánh nhân vật.So sánh chuỗi và thứ tự chữ cái của các nhân vật riêng lẻ

Ký tự >0 (số không) có giá trị thập phân sau 6248 tương ứng.

Khi tôi so sánh hai nhân vật trong đoạn mã sau, tôi nhận được giá trị True (đó là chính xác)

Console.WriteLine('>' > '0'); 

Khi tôi so sánh hai chuỗi một nhân vật trong đoạn mã sau, tôi nhận được giá trị -1 mà chỉ ra rằng ">" nhỏ hơn "0" (văn hóa mặc định là tiếng Anh)

Console.WriteLine(string.Compare(">", "0")); 

trong khi so sánh giữa "3" và "1" (5149 đang valu es) trong mã sau trả 1 (như mong đợi)

Console.WriteLine(string.Compare("3", "1")); 

Ngoài ra, string.Compare(string str1, string str2) tài liệu nói:

Việc so sánh sử dụng văn hóa hiện tại để có được văn hóa cụ thể thông tin như quy tắc vỏ và thứ tự chữ cái của các ký tự riêng lẻ

Bạn có thể giải thích (hoặc cung cấp tham chiếu đến một số tài liệu) không? so sánh tring được triển khai, ví dụ: cách thứ tự chữ cái của các ký tự riêng lẻ được tính như thế nào?

Trả lời

14

Khi bạn so sánh các ký tự '>''0', bạn đang so sánh các giá trị thứ tự của chúng.

Để có được hành vi tương tự từ một sự so sánh chuỗi, cung cấp các thứ loại chuỗi so sánh:

Console.WriteLine(string.Compare(">", "0", StringComparison.Ordinal)); 
    Console.WriteLine(string.Compare(">", "0", StringComparison.InvariantCulture)); 
    Console.WriteLine(string.Compare(">", "0", StringComparison.CurrentCulture)); 

Văn hóa hiện nay được sử dụng bởi mặc định, trong đó có một thứ tự sắp xếp nhằm sắp xếp chuỗi 'thứ tự abc' thay trong thứ tự từ vựng nghiêm ngặt, đối với một số định nghĩa theo thứ tự bảng chữ cái.

0

trả về -1 vì nó đang so sánh str2 đến str1, không phải theo cách khác. Ví dụ: "là 48 bằng 62". Không, nó nhỏ hơn 62 vì vậy nó trả về -1. Đó là ngữ nghĩa một chút bối rối khi bạn đọc thứ tự tham số

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/84787k22.aspx) nói "String.Compare (Stra, strB) - Ít hơn zero - Stra ít hơn strB. " Ví dụ, 'string.Compare (" A "," B ")' trả về '-1' -' "A" 'nhỏ hơn' "B" '. Tại sao '"> "' nhỏ hơn '" 0 "'? – dtb

+0

Tôi đã cập nhật câu hỏi của mình: khi bạn so sánh "3" với "1", bạn nhận giá trị '1' trong đó" 3 "có mã 51 và" 1 "có mã 49 (như mong đợi). Vì vậy, điều đó không phù hợp với lời giải thích của bạn. – Alexandar

+0

@ Alexandar điểm tốt. Tôi nghĩ PeteKirkham đã trả lời nó tốt hơn tôi – DiskJunky

17

Thứ tự sắp xếp của các chuỗi phụ thuộc vào văn hóa bạn sử dụng.

StringComparer.CurrentCulture sắp xếp các chuỗi 1 ký tự sau như sau trên máy tính của tôi:

' - ! " # $ % & () * , ./: ; ? @ [ 
\ ]^_ ` { | } ~ + <=> 0 1 2 3 4 5 6 
7 8 9 a A b B c C d D e E f F g G h H i 
I j J k K l L m M n N o O p P q Q r R s 
S t T u U v V w W x X y Y z Z 

StringComparer.Ordinal cả các loại dây tương tự như sau:

! " # $ % & ' () * + , - ./0 1 2 3 
4 5 6 7 8 9 : ; <=> ? @ A B C D E F G 
H I J K L M N O P Q R S T U V W X Y Z [ 
\ ]^_ ` a b c d e f g h i j k l m n o 
p q r s t u v w x y z { | } ~ 
+5

Bạn không thông báo cho chúng tôi biết văn hóa hiện tại của bạn là gì, và đó là một sự xấu hổ. Tôi có thể nói rằng nó không phải là "fy-NL" (West Frisian (Hà Lan)), bởi vì sau đó chữ cái 'y' sẽ nằm bên cạnh' i'. Ngoài ra, nó không thể là '" et-EE "' (tiếng Estonia (Estonia)), vì vậy, 'z' sẽ nằm cạnh' s'. –

+0

Người dùng dtb nằm ở Đức theo hồ sơ SO. –

2

Nghe có vẻ giống như những gì bạn muốn là sự so sánh để không sử dụng các quy tắc cụ thể về văn hóa. Bạn đã thử StringComparison chưa.TT:

Console.WriteLine(string.Compare(">", "0", StringComparison.Ordinal)); // returns a positive number 
Các vấn đề liên quan