2010-04-12 18 views
6

Entrée:Comment trier dans nombre alphanumérique

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

sortie nécessaire:

SHB 22X, 111U SHC, SHA 5555G

Je dois trier seulement Vehicle no dans la zone de stationnement non pref ix et la lettre de suffixe

Répondre

4

Il n'y a rien de intégré pour faire cela, mais vous pouvez le faire en extrayant d'abord les nombres et le tri en fonction de cela. Par exemple:

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

Ceci est non testé (et probablement ne sera pas même compilation sans modification), n'a pas de contrôle d'erreur, et est probablement pas la méthode la plus rapide dans le monde, mais devrait vous donner une idée.

+0

Nous avons eu la même idée! vous avez écrit du code, donc vous obtenez un upvote! – msarchet

+0

Merci pour votre suggestion, je vais essayer – drop

+0

@Dean Harding, + 1Merci de l'idée. – Hadas

0

Une bonne façon de le faire serait de faire quelque chose comme ça

Ecrire une expression régulière pour correspondre uniquement la partie numérique du nom, mettez dans une collection de valeurs entières paires, le premier étant le nombre vous avez tiré de votre chaîne et le second étant l'indice du nombre dans la liste originale. Puis trier la deuxième liste, puis réorganiser la première liste en utilisant le deuxième numéro de votre collection.

+0

Merci, je peux essayer – drop

0

Utilisez une méthode de tri qui accepte un objet IComparer et transmettez-lui votre collection de numéros de véhicule. Vous devrez définir une classe personnalisée qui implémente IComparer. Dans la méthode Compare de cette classe, vous pouvez écrire du code pour comparer les deux numéros de véhicules. Vous devriez probablement utiliser une regex pour extraire la partie numérique du numéro de véhicule.

+0

Merci, votre aide – drop

1

S'il est possible d'avoir une plaque sans numéro, vous devriez vérifier cela.

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

} 

S'il est absolument impossible et la fin du monde viendrait avant qu'il ne pourrait jamais être une plaque sans chiffres alors cette forme raccourcie fonctionnera:

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

}