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?
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
'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)'). –
@JeroenMostert Vấn đề hiện diện ngay cả với InvariantCulture, mà phải là "ổn định" – xanatos