为什么String.CompareTo不占字符串长度?

Jen*_*ter 1 c# string compareto

给出一个有序列表:

var lst = new []{"1","10","2","b","ab"};
var lst2 = lst.OrderBy(c => c);
Run Code Online (Sandbox Code Playgroud)

结果lst2:

1,10,2,ab,b

为什么在比较时String.Compare()还不测量字符串的长度?我原以为结果会更像这样:

1,2,10,b,ab

因为10(某事(1)和某事物(0))应该 2 之后(某事(2)而没有)

有人能说出一个很好的理由吗?

Mar*_*der 10

如果世界使用您的排序算法,电话簿怎么样?

  • 安娜
  • 贝尔塔
  • 安娜玛丽
  • 贝娅特丽克丝

字符串比较基于首先比较第一个字母(ot更好:字符),如果它们等于第二个字符,等等.它不是基于单词的长度.


Dan*_*rth 6

字符串是一组字符.
在比较字符串时,它基本上是一个集合比较,即比较两个字符串的第一个字符.只有它们是相同的是下一个字符比较等.

通过第一个字符正确对齐无序字符串列表时,这一点很明显:

"1"
"10"
"2"
"b"
"ab"
Run Code Online (Sandbox Code Playgroud)

订购后,结果将是:

"1"
"10"
"2"
"ab"
"b"
Run Code Online (Sandbox Code Playgroud)

原因:

  • "2"会来"1",因为'2'> '1'.
  • "2"将来"10",因为,再次,'2'> '1'.将'0'"10"不考虑,因为第一个字符的比较已经导致一个明确的结果.
  • "ab"会来"2",因为'a'>'2'
  • "b"会来"ab",因为'b'> 'a'.将'b'"ab"不考虑,因为第一个字符的比较已经导致一个明确的结果.

如果您希望按照您想要的方式对字符串中的数字进行排序,您可能需要查看"自然排序".
你的字符串的顺序是没有意义的,所以你可能必须自己构建它.