Tri alphanumérique avec LINQ
Le tri des chaînes alphanumériques, où chaque élément se termine par une valeur numérique, peut être difficile avec le mécanisme de tri par défaut de LINQ. Le problème survient lorsque l'on s'appuie uniquement sur l'ordre alphabétique, ce qui entraîne des résultats de tri inattendus.
Considérez le tableau de chaînes suivant :
string[] partNumbers = new string[] { "ABC10", "ABC1", "ABC2", "ABC11", "ABC10", "AB1", "AB2", "Ab11" };
L'application directe de la méthode OrderBy de LINQ produira le résultat trié suivant :
AB1 Ab11 AB2 ABC1 ABC10 ABC10 ABC11 ABC2
Ce résultat s'écarte de l'attente souhaitée car les valeurs numériques à la fin ne sont pas prises en compte correctement.
Solution
Pour réaliser le tri souhaité, il est nécessaire de remplir les parties numériques des chaînes dans la clé de tri. Cela peut être accompli avec une méthode personnalisée, telle que PadNumbers, définie comme suit :
public static string PadNumbers(string input) { return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0')); }
Cette méthode remplace toute séquence numérique dans la chaîne d'entrée par son équivalent complété. En utilisant cette méthode dans la clause OrderBy, les parties numériques sont effectivement normalisées pour comparaison :
var result = partNumbers.OrderBy(x => PadNumbers(x));
Cette approche garantit que les valeurs numériques sont traitées de manière égale, quelle que soit leur longueur, ce qui entraîne le tri alphanumérique souhaité :
AB1 AB2 AB11 ...
Bien que cette solution suppose un nombre maximum de chiffres pour les nombres, elle fournit une méthode robuste pour le tri alphanumérique en utilisant LINQ.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!