Как сортировать номер в буквенно-цифровой
-
26-09-2019 - |
Вопрос
Вход:
SHC 111U, SHB 22X ,, SHA 5555G
Необходимый выход:
SHB 22X, SHC 111U, SHA 5555G
Я должен сортировать только Vehicle no
На парковке не префикс и суффикс письмо
Решение
Фантастическое, хорошо оптимизированное решение с открытым исходным кодом в http://dotnetperls.com/alphanumeric-sorting.
Другие советы
Нет ничего встроенного, чтобы сделать это, но вы можете сделать это, сначала извлекая цифры и сортировку на основе этого. Например:
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);
}
}
Хороший способ сделать это, чтобы сделать что-то вроде этого
Напишите регулярное выражение, чтобы соответствовать только цифрованной части имени, поместите, что в коллекции сопряженных целочисленных значений, первое существо, которое вы вытащили из строки, а второй - индекс числа в исходном списке. Затем сортируйте второй список, а затем переполните первый список, используя второе число в вашей коллекции.
Используйте метод сортировки, который принимает Incomparer. Объект и пройти свою коллекцию номеров автомобилей. Вам нужно будет определить пользовательский класс, который реализует ICOMPARER. В сравнении этого класса вы можете написать код для сравнения двух номеров автомобилей. Возможно, вы должны использовать Regex для извлечения численной части номера автомобиля.