2013-04-23 2 views
1

Учитывая упорядоченный список:Почему String.CompareTo не учитывает длину строки?

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

результат lst2:

1, 10, 2, аб, б

Почему String.Compare() также не измерить на длине строка, когда она сравнивается? я бы подумал, что результат будет больше, как это:

1, 2, 10, B, AB

Поскольку 10 (что-то (1) и Somthing (0)) должны быть после 2 (что-то (2) и ничего)

Может ли кто-нибудь дать веские основания для этого?

+2

Хотя я могу понять 2 до 10 (естественный сорт), я не могу понять, почему b до ab. – Vladimir

+0

Вы можете сделать 'var lst2 = lst.OrderBy (c => c.Length) .ThenBy (c => c);' но он не даст того, что вы хотите. –

+0

@ Владымир Фролов: Это не так. Вероятно, скопируйте/вставьте ошибку. – Jon

ответ

6

Строка представляет собой набор символов.
При сравнении строк это в основном представляет собой сравнительное сравнение, то есть сравнивается первый символ обеих строк. Только если они одинаковы, являются следующими символами по сравнению т.д.

При правильном выравнивании списка неупорядоченных строк их первым символом, это становится очевидным:

"1" 
"10" 
"2" 
"b" 
"ab" 

После заказа, результат будет:

"1" 
"10" 
"2" 
"ab" 
"b" 

Причины:

  • "2" придет после того, как "1", т.к. '2'>'1'.
  • "2" придет после "10", т.к., снова, '2'>'1'. '0' в "10" не учитывается, потому что сравнение первых символов уже приводит к однозначному результату.
  • "ab" придет после "2", потому что 'a'>'2'
  • "b" придет после "ab", потому что 'b'>'a'.'b' в "ab" не учитывается, потому что сравнение первых символов уже приводит к однозначному результату.

Если вы хотите, чтобы номера в строках были заказаны так, как вы хотите, вы можете посмотреть в "Natural Sort".
Порядок ваших строк не имеет смысла, поэтому вам, вероятно, придется самому это сделать.

+0

Он отлично подходит для сравнения значений символов, а не строки отверстия. Спасибо за это. –

10

Если мир использует ваш алгоритм сортировки, как выглядит телефонная книга?

  • Анна
  • Берта
  • Annamarie
  • Беатрикс

Стринг-сравнение основано на первом сравнить первую букву (ВЗ лучше: характер), если они равны, второй символ и т. д. Он не основан на длине слова.

+2

1+ для хорошей точки. –

0

Зачем 10 быть после 2?

Если вы заказываете слова, используя алфавитный порядок следующие слова: x y xy, то результат x xy y.

Для номера это точно то же самое с расширенным набором символов.