是否有充分的理由对字符串使用文化敏感的比较器?

时间:2015-03-28 00:04:14

标签: c# .net string comparison cultureinfo

在深入研究.NET代码后,我发现由Comparer<string>.Default生成的比较器和string.CompareTo的实现使用区分文化的字符串比较(特别是对CultureInfo.CurrentCulture敏感)。有序集和映射的默认行为是使用此比较器。

但是,F#的有序SetMap为使用String.CompareOrdinal的字符串创建了一个特殊的比较器。因此,使用字符串键时,这些集合比最近的System.Collections.Immutable排序字典和有序映射要快得多,如下图所示:

Chart

我也在创建一个不可变集合库(它在图表中称为Funq)。在我执行此优化之前,我遇到了与这些集合相同的性能问题。

考虑到我肯定想要在有序集合中保持预期的排序,这种优化是否会导致任何问题?你能举出具体的例子,在特定的文化中不会像预期的那样表现吗?

1 个答案:

答案 0 :(得分:2)

不确定

"a" vs "B"使用CompareOrdinal进行排序的方式与使用CurrentCulture,InvariantCulture和InvariantCulture忽略大小写的方式不同。

示范:http://rextester.com/QSCF42204

string a = "a";
string b = "B";
Console.WriteLine(Comparer<string>.Default.Compare(a, b));
Console.WriteLine(string.CompareOrdinal(a, b));
Console.WriteLine(string.Compare(a, b, true, System.Globalization.CultureInfo.InvariantCulture));
Console.WriteLine(string.Compare(a, b, false, System.Globalization.CultureInfo.InvariantCulture));