2009-03-25 7 views
1

J'ai une liste qui doit commander des voix:C# Regex chaînes de lettres de tri et numéro

R1-1 
R1-11 
R2-2 
R1-2 

ce doit être commandé:

R1-1 
R1-2 
R1-11 
R2-2 

Actuellement, je suis en utilisant la méthode C# Regex.Replace et ajouter un 0 avant l'occurrence de nombres uniques à la fin d'une chaîne avec quelque chose comme:

Regex.Replace(inString,@"([1-9]$)", @"0$2") 

Je suis sur Il y a une meilleure façon de faire cela que je ne peux pas comprendre. Est-ce que quelqu'un a un bon moyen de trier les chaînes de lettres et de chiffres avec regex?


J'ai utilisé la méthode de Greg ci-dessous pour compléter ce et juste pensé que je devrais ajouter le code que je me sers pour être complet:

public static List<Rack> GetRacks(Guid aisleGUID) 
    { 
     log.Debug("Getting Racks with aisleId " + aisleGUID); 
     List<Rack> result = dataContext.Racks.Where(
           r => r.aisleGUID == aisleGUID).ToList(); 
     return result.OrderBy(r => r.rackName, new NaturalStringComparer()).ToList(); 
    } 

Répondre

4

Je pense que ce que vous êtes après un ordre de tri naturel, comme Windows Explorer fait? Si oui, j'ai écrit une entrée de blog il y a un certain temps montrant how you can achieve this in a few lines of C#.

Remarque: Je viens de vérifier et en utilisant le NaturalStringComparer dans l'entrée liée renvoie l'ordre que vous recherchez avec les exemples de chaînes.

+0

Grande réponse Greg! J'ai maintenant utilisé cette solution et ajouterai la méthode que j'utilise dans ma question pour l'exhaustivité. – bobwah

+0

Ya, super greg! Dommage que le lien est mort –

+0

Nouveau lien: http://gregbeech.com/blog/natural-sort-order-of-strings-and-files –

2

Vous pouvez écrire votre propre comparateur et utiliser des expressions régulières pour comparer le nombre entre "R" et "-" en premier, suivi du nombre après "-", si les premiers chiffres sont égaux.

Sketch:

public int Compare(string x, string y) 
{ 
    int releaseX = ...; 
    int releaseY = ...; 
    int revisionX = ...; 
    int revisionY = ...; 

    if (releaseX == releaseY) 
    { 
     return revisionX - revisionY; 
    } 
    else 
    { 
     return releaseX - releaseY; 
    } 
} 
+0

Edit: Hmm .. La solution de Greg Beech est sympa! - Alors prenez ceci comme un moyen de le résoudre si vous voulez éviter l'utilisation d'un DllImport. – chiccodoro

+0

Merci pour la réponse! J'ai utilisé la solution de Greg mais c'est bien d'avoir ça pour d'autres références. – bobwah

Questions connexes