2010-04-12 16 views
6

ingresso:Come ordinare numero in alfanumerico

SHC 111U, SHB 22x ,, SHA 5555G

uscita Needed:

SHB 22X, SHC 111U, SHA 5555G

Devo ordinare solo Vehicle no nell'area di parcheggio non pref ix e lettera di suffisso

risposta

4

Non c'è nulla di built-in per fare questo, ma è possibile farlo prima estrazione dei numeri e l'ordinamento in base a questo. Per esempio:

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

Questo è testato (e probabilmente non sarà nemmeno la compilazione senza modifiche), non ha alcun controllo degli errori, e probabilmente non è il metodo più veloce del mondo, ma dovrebbe darvi un'idea.

+0

Abbiamo avuto la stessa idea! hai scritto il codice, quindi ottieni un upvote! – msarchet

+0

Grazie per il tuo suggerimento, proverò – drop

+0

@Dean Harding, + 1 grazie all'idea. – Hadas

0

Un buon modo per farlo sarebbe quello di fare qualcosa di simile

Scrivi un'espressione regolare per abbinare solo la parte numerica del nome, che mettere in una collezione di valori interi accoppiati, il primo è il numero di hai tirato fuori dalla tua stringa e il secondo è l'indice del numero nella lista originale. Quindi ordina il secondo elenco, quindi riordina il primo elenco utilizzando il secondo numero della raccolta.

+0

Grazie, posso provare – drop

0

Utilizzare un metodo di ordinamento che accetta un oggetto IComparer e passarlo vostra collezione di numero di veicoli. Dovrai definire una classe personalizzata che implementa IComparer. Nel metodo Confronto di quella classe è possibile scrivere il codice per confrontare i due numeri di veicolo. Probabilmente dovresti usare una regex per estrarre la parte numerica del numero del veicolo.

+0

Grazie, il tuo aiuto – drop

1

Se è possibile avere un piatto senza un numero, allora si dovrebbe verificare per questo.

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

} 

Se è assolutamente impossibile e la fine del mondo verrebbe prima ci potrebbe mai essere una piastra senza numeri allora questa forma abbreviata funzionerà:

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

} 
Problemi correlati