在深入研究.NET代码后,我发现由Comparer<string>.Default
生成的比较器和string.CompareTo
的实现使用区分文化的字符串比较(特别是对CultureInfo.CurrentCulture
敏感)。有序集和映射的默认行为是使用此比较器。
但是,F#的有序Set
和Map
为使用String.CompareOrdinal
的字符串创建了一个特殊的比较器。因此,使用字符串键时,这些集合比最近的System.Collections.Immutable
排序字典和有序映射要快得多,如下图所示:
我也在创建一个不可变集合库(它在图表中称为Funq)。在我执行此优化之前,我遇到了与这些集合相同的性能问题。
考虑到我肯定想要在有序集合中保持预期的排序,这种优化是否会导致任何问题?你能举出具体的例子,在特定的文化中不会像预期的那样表现吗?
答案 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));