@@ -152,27 +152,36 @@ public int Compare(string str1, string str2)
152152 if ( paddingCompare != 0 )
153153 return paddingCompare ;
154154 }
155- else if ( _stringComparer is not null )
156- {
157- // compare both tokens as strings
158- var tokenString1 = str1 . Substring ( startIndex1 , rangeLength1 ) ;
159- var tokenString2 = str2 . Substring ( startIndex2 , rangeLength2 ) ;
160- var stringCompare = _stringComparer . Compare ( tokenString1 , tokenString2 ) ;
161- if ( stringCompare != 0 )
162- return stringCompare ;
163- }
164155 else
165156 {
166- // use string comparison
167- var minLength = Math . Min ( rangeLength1 , rangeLength2 ) ;
168- var stringCompare = string . Compare ( str1 , startIndex1 , str2 , startIndex2 , minLength , _stringComparison ) ;
169- if ( stringCompare == 0 )
157+ // only compare non-numeric tokens up to the shorter of their lengths
158+ if ( rangeLength1 < rangeLength2 )
170159 {
171- stringCompare = rangeLength1 - rangeLength2 ;
160+ rangeLength2 = rangeLength1 ;
161+ endIndex2 = startIndex2 + rangeLength2 ;
162+ }
163+ else if ( rangeLength2 < rangeLength1 )
164+ {
165+ rangeLength1 = rangeLength2 ;
166+ endIndex1 = startIndex1 + rangeLength1 ;
172167 }
173168
174- if ( stringCompare != 0 )
175- return stringCompare ;
169+ if ( _stringComparer is not null )
170+ {
171+ // compare both tokens as strings
172+ var tokenString1 = str1 . Substring ( startIndex1 , rangeLength1 ) ;
173+ var tokenString2 = str2 . Substring ( startIndex2 , rangeLength2 ) ;
174+ var stringCompare = _stringComparer . Compare ( tokenString1 , tokenString2 ) ;
175+ if ( stringCompare != 0 )
176+ return stringCompare ;
177+ }
178+ else
179+ {
180+ // use string comparison
181+ var stringCompare = string . Compare ( str1 , startIndex1 , str2 , startIndex2 , rangeLength1 , _stringComparison ) ;
182+ if ( stringCompare != 0 )
183+ return stringCompare ;
184+ }
176185 }
177186
178187 startIndex1 = endIndex1 ;
0 commit comments