【发布时间】:2020-11-09 14:04:21
【问题描述】:
我们首先有一个用于数据库的旧式 db gen 工具。我在没有实际更改的情况下对内容进行更改。我把它归结为列的排序。
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("sv-SE");
var sortThis = new[] { "VatNumber", "VisiAvtalsnummerCompanies", "WinZipPassword" }
.OrderBy(s => s, StringComparer.CurrentCultureIgnoreCase)
.ToList();
输出应该是“VatNumber”、“VisiAvtalsnummerCompanies”、“WinZipPassword”,在瑞典文化中 V 在字母表中排在 W 之前。
但在我的电脑上输出的是“VatNumber”、“WinZipPassword”、“VisiAvtalsnummerCompanies”
C# fiddle 上的服务器输出正确
https://dotnetfiddle.net/sXJjD6
编辑:
StringComparer.Create(new CultureInfo("sv-SE"), true)
.Compare("V", "W"); // -1 correct
StringComparer.Create(new CultureInfo("sv-SE"), true)
.Compare("VB", "WA"); // 1 incorrect
【问题讨论】:
-
如果将
StringComparer.CurrentCultureIgnoreCase替换为StringComparer.Create(new CultureInfo("sv-SE"), true)会发生什么? -
如果它正在排序 V - W - V 那么它不是排序。这似乎不太可能,但是当似乎发生了不可能的事情时,总是有一个不正确的假设。我最好的猜测是它是按字符串长度排序的。这意味着本地执行的代码可能不是你想象的那样。
-
只是一个想法。在大多数情况下,使用的区域性设置是从您机器的区域设置中检索的。因此,如果您已指定您的机器区域为
sv-SE,但您已经否决了这些设置,那么您的区别就在于此。你有没有和别人的机器比较过? -
有时在您的源代码中存在隐藏的不可打印字符——尤其是当这些字符通过复制粘贴来自网页时。您能否仔细检查字符串是否正确编码且没有隐藏字符? (我问这个是因为小提琴与这篇文章中的代码并不是逐个字符相同的——添加了 cmets,所以它们表面上并不相同。)
-
这可能是相关的吗? Culture sv-SE sort order for strings does not handle the order of v and w correctly?它只是强化了罪魁祸首可能与操作系统有关。
标签: c# sorting globalization