de entrada:Cómo ordenar número en alfanumérica
SHC 111U, SHB 22x ,, SHA 5555G
de salida necesarios:
SHB de 22X, SHC 111U, SHA 5555G
Tengo que ordenar solo Vehicle no
en el área de estacionamiento no pref ix y la letra del sufijo
de entrada:Cómo ordenar número en alfanumérica
SHC 111U, SHB 22x ,, SHA 5555G
de salida necesarios:
SHB de 22X, SHC 111U, SHA 5555G
Tengo que ordenar solo Vehicle no
en el área de estacionamiento no pref ix y la letra del sufijo
fantástico de código abierto, bien optimizado solución al http://dotnetperls.com/alphanumeric-sorting
No hay nada incorporado para hacer esto, pero puede hacerlo primero extrayendo los números y ordenando según eso. Por ejemplo:
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);
}
}
Esto no se ha probado (y probablemente ni siquiera compilar sin modificaciones), tiene control de errores, y probablemente no es el método más rápido en el mundo, pero debe darle una idea.
Una buena manera de hacer esto sería hacer algo como esto
Escribir una expresión regular para que coincida con sólo la parte numérica del nombre, poner esto en un conjunto de valores enteros pares, siendo el primero el número sacó de su cadena y el segundo es el índice del número en la lista original. Luego, clasifique la segunda lista, y luego reordene la primera lista usando el segundo número en su colección.
Gracias, puedo probar – drop
Utilice un método de clasificación que acepte un objeto IComparer y páselo a su colección de números de vehículo. Deberá definir una clase personalizada que implemente IComparer. En el método de comparación de esa clase, puede escribir código para comparar los dos números de vehículo. Probablemente deberías usar una expresión regular para extraer la parte numérica del número del vehículo.
Gracias, su ayuda – drop
Si es posible tener una placa sin un número, entonces debe verificarlo.
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);
}
}
Si es absolutamente imposible y el fin del mundo vendría antes alguna vez podría ser una placa sin números entonces esta forma acortada funcionará:
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);
}
}
Gracias por una buena referencia Artículo – drop