我有一個Windows 2019服務器(所有語言設定都設定為en-US ),其代碼如下:
var unsorted = new[] {"Aldi", "Al-Murad Tiles", "AliExpress" };
Console.WriteLine("Unsorted: " string.Join(',', unsorted));
var sorted = unsorted.OrderBy(x => x);
Console.WriteLine("Sorted: " string.Join(',', sorted));
產生:

我有一臺Windows 11機器(所有語言設定都設定為en-GB ),它產生相同的代碼:

如果我將當前執行緒的文化設定為與服務器相同,則沒有區別:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
有誰知道應該對當前執行緒應用哪些設定,以使現有代碼在 Windows 11 機器上的排序與在服務器上的排序相同?
(值得一提的是,這是一個從更大的遺留代碼庫中提取的示例,因此我想對影響當前執行緒/背景關系/環境的代碼進行最少的更改,以使這種排序作業而不是重構現有代碼)
uj5u.com熱心網友回復:
在 .NET 5 中,全球化 API 現在在 Windows 上使用 ICU 庫,而不是 NLS,所以如果您的一臺機器在 .NET 5 上運行,而另一臺運行的是早期版本,那么這可以解釋為什么要更改當前執行緒的文化資訊根本沒有幫助。
您可以使用Ordinal比較:
var sorted = unsorted.OrderBy(x => x, StringComparer.Ordinal);
或者,您也可以通過編輯 runtimeconfig.json使您的 .NET 5 應用程式使用 NLS
"configProperties": { "System.Globalization.UseNls": "true" }
或者設定DOTNET_SYSTEM_GLOBALIZATION_USENLS環境變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/437141.html
