Вход:
SHC 111U, SHB 22x, SHA 5555G
Необходимый вывод:
SHB 22X, SHC 111U, SHA 5555G
Я должен отсортировать только Vehicle no
на Стоянке не буква префикса и буква суффикса
Фантастическое, хорошо оптимизированное решение с открытым исходным кодом на http://dotnetperls.com/alphanumeric-sorting
] Используйте метод Sort, который принимает объект IComparer , и передайте ему вашу коллекцию номеров транспортных средств. Вам нужно будет определить собственный класс, реализующий IComparer. В методе Compare этого класса вы можете написать код для сравнения двух номеров транспортных средств. Вероятно, вам следует использовать регулярное выражение для извлечения числовой части номера транспортного средства.
Хороший способ для этого нужно было бы сделать что-то вроде этого
Напишите регулярное выражение, которое соответствует только числовой части имени, поместите его в коллекцию парных целочисленных значений, первое из которых будет числом, которое вы вытащили из своей строки, а второе индекс числа в исходном списке. Затем отсортируйте второй список, а затем измените порядок первого списка, используя второе число в вашей коллекции.
Для этого нет ничего встроенного, но вы можете сделать это, сначала извлекая числа и выполняя сортировку на их основе. Например:
class VehicleNumberComparer : IComparer<string>
{
public int Compare(string lhs, string rhs)
{
var numExtract = new Regex("[0-9]+");
int lhsNumber = int.Parse(numExtract.Match(lhs).Value);
int rhsNumber = int.Parse(numExtract.Match(rhs).Value);
return lhsNumber.CompareTo(rhsNumber);
}
}
Это не проверено (и, вероятно, даже не будет компилироваться без модификации), в нем нет проверки ошибок и, вероятно, это не самый быстрый метод в мире, но он должен дать вам представление.
Если возможно иметь табличку без номера, проверьте ее.
static int SortPlate(string plate)
{
int plateNumber;
Regex regex = new Regex(@"\d+");
Int32.TryParse(regex.Match(plate).Value, out plateNumber);
return plateNumber;
}
static void Main(string[] args)
{
IEnumerable<string> data = new List<string>() {"SHC 111U", "SHB 22x", "SHA 5555G", "HOT STUFF"};
var sortedList = from z in data
orderby SortPlate(z)
select z;
foreach (string plate in sortedList)
{
Console.WriteLine(plate);
}
}
Если это абсолютно невозможно и конец света наступит раньше, чем когда-либо появится табличка без номеров, тогда эта сокращенная форма будет работать:
static void Main(string[] args)
{
IEnumerable<string> data = new List<string>() {"SHC 111U", "SHB 22x", "SHA 5555G"};
Regex regex = new Regex(@"\d+");
var sortedList = from z in data
orderby Int32.Parse(regex.Match(z).Value)
select z;
foreach (string plate in sortedList)
{
Console.WriteLine(plate);
}
}