2010-04-12 14 views
6

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

Respuesta

4

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.

+0

¡Tuvimos la misma Idea! escribiste el código, ¡así que obtienes un voto positivo! – msarchet

+0

Gracias por su sugerencia, intentaré – drop

+0

@ Dean Harding, + 1Gracias por la idea. – Hadas

0

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.

+0

Gracias, puedo probar – drop

0

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.

+0

Gracias, su ayuda – drop

1

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); 
    } 

} 
Cuestiones relacionadas