2015-02-25 22 views
13

Trong khi so sánh các chuỗi trong C#, clr khác nhau cho các kết quả khác nhau trên Windows 7 sp1 x64. Đây là mẫu mã:Kết quả phân loại khác nhau trên các phiên bản CLR khác nhau

List<string> myList = new List<string>(); 
myList.AddRange(new[] { "!-", "-!", "&-l", "&l-", "-(", "(-", "-*", "*-", ".-", "-.", "/'", "-/" }); 
myList.Sort(); 
Console.WriteLine(Environment.Version); 
myList.ForEach(Console.WriteLine); 
Console.WriteLine(); 
Console.WriteLine(string.Compare("!-", "-!")); 
Console.WriteLine("!-".CompareTo("-!")); 

đây là đầu ra mẫu:


Nếu tôi đặt Target Framework để 4.0:

4.0.30319.18444 
!- 
-! 
&l- 
&-l 
(- 
-(
*- 
-* 
.- 
-. 
/' 
-/ 

-1 
-1 

Nếu tôi đặt Target Framework đến 2,0 :

2.0.50727.5485 
-! 
!- 
&-l 
&l- 
-(
(- 
-* 
*- 
-. 
.- 
-/ 
/' 

1 
1 

Tôi có thiếu gì không?

+0

Trong .NET 4.0, Unicode đã thay đổi từ 5.0 thành 5.1, vì vậy có lẽ đó là sự khác biệt. Đáng buồn là có rất ít tài liệu về điều này – xanatos

+4

'List.Sort()' sử dụng trình so sánh mặc định và trình so sánh mặc định cho 'chuỗi' sử dụng văn hóa hiện tại. Điều này, đến lượt nó, phụ thuộc vào các bảng đối chiếu được cung cấp với .NET và các bảng này có thể thay đổi. Nếu bạn muốn kết quả nhất quán, hãy sử dụng so sánh dựa trên thứ tự ('List.Sort (StringComparer.Ordinal)'). –

+1

@JeroenMostert Vấn đề hiện diện ngay cả với InvariantCulture, mà phải là "ổn định" – xanatos

Trả lời

2

Hãy đảm bảo rằng bạn sắp xếp với MyList.Sort(StringComparer.Ordinal).

Trừ khi Unicode bắt đầu thay đổi mã ký tự của chúng, nó sẽ cung cấp thứ tự sắp xếp không đổi. Thứ tự sẽ dựa trên ID mã thực tế được gán cho chúng.

Nếu tôi lấy ví dụ đầu tiên của bạn so sánh này:

-! 
!- 

Dấu gạch ngang là U + 002D và dấu chấm than là U + 0021. Những mã này đã không thay đổi vì ít nhất là các bảng ASCII. Tôi sẽ xem xét việc kiểm tra các thông số sắp xếp của bạn để đảm bảo bạn chỉ so sánh theo thứ tự và không dựa trên nền văn hóa trung tính/cụ thể thực tế.

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