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
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
Eccellente, ben ottimizzato open source soluzione al http://dotnetperls.com/alphanumeric-sorting
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.
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.
Grazie, posso provare – drop
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.
Grazie, il tuo aiuto – drop
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);
}
}
Grazie per un buon articolo di riferimento – drop