我在 .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
)但反之则不然!