我有一台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相关问答推荐

将多行参数传递给Power Shell中的DotNet Pack命令

等待时 Blazor 服务器按钮刷新

在 Inno Setup 中判断给定服务的依赖服务

AppShell - 返回导航失败,匹配的路由不明确......但我只注册了一次路由

Ubuntu 22.04 + JetBrains Rider 不能做脚手架 dbContext

判断 Windows 路径中是否存在可执行文件

Style 和 ControlTemplate 的区别

共享 AssemblyInfo 用于跨解决方案的统一版本控制

C#:内存不足异常

什么是 project.lock.json?

支持 HTTPS 的 Httplistener

操作对事务的状态无效错误和事务范围

清除 .NET 的 StringBuilder 内容的最佳方法

无法加载文件或程序集Antlr3.Runtime (1)或其依赖项之一

确定使用 ContextMenuStrip 的控件

在 .Net 中调用 Web 服务时绕过无效的 SSL 证书错误

如何在 C# 中处理 XML

通过反射获取公共静态字段的值

Dictionary.Add 与 Dictionary[key]=value 的区别

没有科学记数法的双精度字符串转换