我有一台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));

生产:

enter image description here

我有一台Windows 11机器(所有语言设置都设置为en-GB),同样的代码会产生:

enter image description here

如果我将当前线程的区域性设置为与服务器相同,则没有区别:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

有人知道应该对当前线程应用什么设置,以使Windows 11计算机上的现有代码排序与服务器上的相同吗?

(worth saying this is an example extracted from a much larger legacy codebase so I'd like to make minimal code changes to the affect the current thread/context/environment to make this sorting work rather than re-factor the existing code)

推荐答案

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

您可以使用Ordinal比较:

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

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

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

或设置DOTNET_SYSTEM_GLOBALIZATION_USENLS环境变量.

.net相关问答推荐

使用托管身份而不是检测密钥配置Application Insights

从窗体中移除另一个控件中引用的控件时获取设计时通知

如何从 tshark 的 stderr 捕获实时数据包计数?

ECS服务无法从Cognito获取配置

Msbuild try 构建 msbuild.exe 而不是我的 .csproj 文件

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

process.WaitForExit() 异步

是否有任何为 C# 编写的模糊搜索或字符串相似函数库?

整个命名空间的SuppressMessage

抛出 ArgumentNullException

为什么需要 XmlNamespaceManager?

调用委托与方法的性能

msbuild,定义条件编译符号

使用 C# 在 .NET 4.0 中 Task.Run 的替代方法是什么?

在 C# 中与块等效?

测试没有预期的异常

C# 测试字符串是否为整数?

序列化和反序列化 .NET 对象的最快方法

C# 应用程序中的资源和嵌入式资源有什么区别?

在类型 c# 上切换大小写