如何规范机器之间连字符的排序顺序?

How can I normalise sort order of hypens between machines?

我有一个 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 机器上的排序与在服务器上的排序相同?

(值得一提的是,这是从一个更大的遗留代码库中提取的示例,因此我想对影响当前 thread/context/environment 的代码进行最少的更改,以使排序工作正常进行而不是重构现有代码)

在 .NET 5 中,Globalisation APIs now use ICU libraries, rather than NLS, on Windows,所以如果你的一台机器是 运行 on .NET 5,另一台是 运行 早期版本,那么这可以解释为什么更改当前线程的文化信息根本没有帮助。

您可以使用 Ordinal 比较:

var sorted = unsorted.OrderBy(x => x, StringComparer.Ordinal);

或者,您也可以 make your .NET 5 app use NLS 通过编辑 runtimeconfig.json

"configProperties": { "System.Globalization.UseNls": "true" }

或设置DOTNET_SYSTEM_GLOBALIZATION_USENLS环境变量。