【问题标题】:Why does CompareTo not sort my string using ASCII code ordering?为什么 CompareTo 不使用 ASCII 代码排序对我的字符串进行排序?
【发布时间】:2019-08-20 09:12:30
【问题描述】:

在 C# 中,"123-delete.json".CompareTo("123.json") 的计算结果为 1,这意味着 "123-delete.json" 将排在 "123.json" 之后。

这对我来说是出乎意料的,因为根据 ASCII 表 .- 之后。

我试图浏览 GitHub 上的 CompareTo 实现,但似乎这个逻辑是在本机函数 (InternalCompareString) 中实现的。

为什么CompareTo 方法不遵循 ASCII 顺序?

另外,有没有办法查看InternalCompareString等原生函数的源代码?

【问题讨论】:

  • 在 c# 中,字符串是 unicode 字符的序列。并且比较取决于文化,CompareTo 没有CultureInfo 参数使用当前线程的CultureInfo
  • @RenéVogt,到底发生了什么?如何比较它们以产生这个结果?
  • 请注意,string.CompareOrdinal 可能是您在这里所追求的。
  • Unicode 不是 ASCII,所以这可能就是您得到这些结果的原因。 differencebetween.net/technology/software-technology/…
  • @RenéVogt,1) Unicode 和 ASCII 在开头匹配。 2) 不,我在这里测试过:rextester.com"-".CompareTo(".") 返回-1,而"-a".CompareTo(".b") 返回1。所以比较规则比较复杂。

标签: c# string


【解决方案1】:

使用

string.Compare("123-delete.json", "123.json", StringComparison.Ordinal)

string.CompareOrdinal("123-delete.json", "123.json")

StringComparer.Ordinal.Compare("123-delete.json", "123.json")

在 C# 中,字符串的比较默认情况下取决于区域性,StringComparison.Ordinal 让函数根据二进制排序规则比较字符串。

正如@JeppeStigNielsen 提到的,StringComparer.Ordinal 返回的对象实现了IComparer<string> 接口,这使您可以在有SortedSet<string>SortedList<string> 或任何类型的“集合”的情况下使用这种排序顺序" 使用比较对象的字符串。

【讨论】:

  • 第三种语法(using System;)是StringComparer.Ordinal.Compare("123-delete.json", "123.json")。如果您创建一个新的SortedDictionary<string, Xxx> 或类似的对象(SortedSet<string>SortedList<string, Xxx> 等),对象StringComparer.Ordinal 可以用作IComparer<string>
猜你喜欢
  • 1970-01-01
  • 2019-02-13
  • 2017-06-21
  • 2017-12-03
  • 2012-08-20
  • 2011-12-18
  • 2015-12-07
  • 1970-01-01
  • 2013-09-12
相关资源
最近更新 更多