Это связано с тем, что по умолчанию для строки используется стандартное алфавитно-числовое (лексикографическое) упорядочение, и ABC11 будет предшествовать ABC2, поскольку упорядочение всегда происходит слева направо.
Чтобы получить то, что вы хотите, вам нужно дополнить числовую часть в вашем заказе предложением, что-то вроде:
var result = partNumbers.OrderBy(x => PadNumbers(x));
, где PadNumbers
может быть определено как:
public static string PadNumbers(string input)
{
return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0'));
}
Это дополняет нулями любое число (или числа), которые появляются во входной строке, так что OrderBy
видит:
ABC0000000010
ABC0000000001
...
AB0000000011
Заполнение происходит только для клавиши, используемой для сравнения. Исходные строки (без отступов) сохраняются в результате.
Обратите внимание, что в этом подходе предполагается максимальное количество цифр для чисел на входе.