即使显式设置区域性,也无法在 .NET 7 中重现 .NET Framework 字符串排序顺序

2024-03-05

我在 .NET Framework 4.8 上运行一些遗留代码,这些代码对一些产品代码进行排序并将结果放入单个数据库列中。它已经运行了多年,积累了我无法轻易修改的数据。我需要它在 .NET 7 上同样工作。

代码很简单:

Code

new[] { "123-CAT", "123CAT" }.OrderBy(x => x).ToArray();

.NET框架

[ "123CAT", "123-CAT" ]

.NET 7

[ "123-CAT", "123CAT" ]

我需要 .NET 7 代码来匹配 .NET Framework 结果。

所以我尝试了不同的文化,认为这很简单。令我惊讶的是我找不到任何StringComparer.NET 7 中的文化会给出结果["123CAT", "123-CAT"].

这些都是我尝试过的版本。标有的值***是我想要的结果。

// .NET Framework: 123CAT, 123-CAT   ***
// .NET 7        : 123-CAT, 123CAT
var list_default = new[] { "123-CAT", "123CAT" }.OrderBy(x => x).ToArray();

// .NET Framework: 123CAT, 123-CAT   ***
// .NET 7        : 123-CAT, 123CAT
var list_currentCulture = new[] { "123-CAT", "123CAT" }.OrderBy(x => x, StringComparer.CurrentCulture).ToArray();

// .NET Framework: 123CAT, 123-CAT   ***
// .NET 7        : 123-CAT, 123CAT
var list_invariant = new[] { "123-CAT", "123CAT" }.OrderBy(x => x, StringComparer.InvariantCulture).ToArray();

// .NET Framework: 123-CAT, 123CAT
// .NET 7        : 123-CAT, 123CAT
var list_ordinal = new[] { "123-CAT", "123CAT" }.OrderBy(x => x, StringComparer.Ordinal).ToArray();

基于 ASCII 表我会expect并且可能想要123-CAT首先(因为 - 是 ASCII 45 字符),.NET 7 正是这样做的。但我需要它来匹配 .NET Framework 行为。

我可以让 .NET Framework 匹配 .NET 7(使用StringComparer.Ordinal)但反之则不然!


在 Windows 上的 .NET 5 中,发生了重大变化,将全球化从 NLS 切换到了 ICU。要在 Windows 上恢复到 NLS,您可以将下一个 xml 开关添加到 .cpproj:

<ItemGroup>
  <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>

阅读更多:

  • .NET 全球化和 ICU https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu
  • 在 .NET 5+ 上比较字符串时的行为发生变化 https://learn.microsoft.com/en-us/dotnet/standard/base-types/string-comparison-net-5-plus
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使显式设置区域性,也无法在 .NET 7 中重现 .NET Framework 字符串排序顺序 的相关文章

随机推荐

  • JavaScript:我可以以某种方式强类型函数参数吗?

    我是 JavaScript 新手 我觉得对我正在编码的几个工具的函数参数进行强类型化的需求是不可抗拒的 这将使我在这些函数中自动完成 调试 功能访问变得更加一致 经过一番谷歌搜索后 我想这不可能直接实现 但是 是否有通用工具可以简单地模拟这
  • 将通用数字参数与常量进行比较

    假设我有一个函数将数字参数与常量进行比较并返回布尔值 fn compare n f64 gt bool n gt 42 as f64 这工作正常 但我似乎无法使其通用 fn compare
  • 相当于 -respondsToSelector 的类方法:

    是否有一个类方法相当于 respondsToSelector 就像是 respondsToSelector 我问的原因是因为通过实施 respondsToSelector 在类级别上 我收到编译器警告 在协议中找到 respondsToSe
  • Java 中同步的记忆效应

    JSR 133 常见问题解答 http www cs umd edu users pugh java memoryModel jsr 133 faq html synchronization says 但同步还有更多内容 而不是相互排斥 同
  • webpack.config.js 中的 json-loader 不起作用

    我正在尝试遵循 React 教程 我的 webpack config js 文件如下 var webpack require webpack var pth require path module exports entry src ind
  • MySQL where 子句和 avg() 排序作为子查询

    尽管我可以对别名子查询进行分组和排序 但我无法在 where 子句中使用别名 我需要使用联接吗 Works SELECT entries SELECT avg value FROM ratings WHERE ratings entry i
  • Gradle InstrumentTest 的 AndroidManifest.xml

    有没有办法指定一个额外的AndroidManifest xmlgradle 测试应用程序的文件 我需要它来为我的单元测试指定额外的权限和活动 UPD 我尝试添加instrumnetTest部分中的build gradle文件 但它没有帮助
  • 使用SQL过滤存储过程的结果

    我查看了 Stack Overflow 上与此问题相关的其他问题 但似乎没有一个问题清楚地回答了这个问题 我们有一个名为 sp who2 的系统存储过程 它返回服务器上所有正在运行的进程的信息结果集 我想过滤存储过程返回的数据 从概念上讲
  • Google 脚本 JSON 嵌套数组到单元格

    我试图将以下 JSON 的一部分读入 google 表格 似乎有嵌套数组 我很难将其推入一个单元格 主要 JSON lineItems name advertisers 1558261 lineItems 12317016 advertis
  • Angular2:更改表单验证错误的边框颜色

    尝试更改错误消息的边框颜色 这是我的 html 代码 div class form group div
  • 从对话框片段上的图库中选择照片时光标上出现空指针异常

    我正在尝试从图库中选择照片DialogFragment 但我越来越nullpointerexception初始化时cursor 有什么想法为什么会出现此错误吗 下面是我的代码 if resultCode Activity RESULT OK
  • 连接图中的桥

    我有一个编程任务 不是家庭作业 我必须在图中找到桥梁 我自己做了一些工作 但无法想出任何令人满意的东西 所以我用谷歌搜索了它 我确实找到了一些东西 但我无法理解它所呈现的算法 有人可以看一下这段代码并给我一个解释吗 public Bridg
  • OpenCV - 两个二值图像之间的交集

    假设我有两个相同大小的二值图像 如何找到两个二值图像之间的交集 只有两个白色图像 灰色 255 上相同坐标 位置 的像素才会在输出图像 交集 上给出白色像素 您可以使用cvAnd http opencv itseez com modules
  • Java 构造函数是否返回对象引用?

    我知道 Java 的构造函数不能有任何类型 有趣的是它甚至不能是void 对此的合理解释是构造函数返回初始化对象的引用 MyClass myObject new MyClass 的构造函数myClass现在将在实例化对象后返回对象引用并将其
  • 我可以免费获得 sql2008 的 sql profiler 吗?

    是否可以免费获得 sql2008 的 sql profiler 还是必须有许可证才能获得 即它不能与 sql express 一起使用 您可以使用 SQL Developer 版本获取 SQL Profiler 但之前三个答案是怎么写的 S
  • 在 JavaScript 中访问 PHP 变量 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 JavaScript 或 jQuery 中访问 PHP 变量而不是 https stackoverflow com questions 1808108 how to access php va
  • 如何在服务器端渲染 Three.js?

    如何渲染 Three js 服务器端 目前我们的网站在本地使用 Three js 渲染玩家头像 但这会带来安全问题以及低端计算机的潜在错误 人们可以将代码注入控制台并让它渲染天知道什么 我研究过使用node js 但所有相关文档都很模糊并且
  • 直接从 Angular 客户端订阅 Azure 事件网格主题

    我正在开发一个需要响应来自第三方 WebHook 的事件的应用程序 我选择 Azure Event Grid 作为我选择的事件代理 Angular 作为前端 Asp Net Core 作为后端 在我当前的解决方案中 我使用 HTTP 触发的
  • firebase 中的用户组

    A User定义为 public class User private String email private String uid private List
  • 即使显式设置区域性,也无法在 .NET 7 中重现 .NET Framework 字符串排序顺序

    我在 NET Framework 4 8 上运行一些遗留代码 这些代码对一些产品代码进行排序并将结果放入单个数据库列中 它已经运行了多年 积累了我无法轻易修改的数据 我需要它在 NET 7 上同样工作 代码很简单 Code new 123