Tri alphanumérique à l'aide de LINQ
Lorsque vous traitez des chaînes qui incluent des valeurs numériques, le tri alphabétique par défaut dans LINQ peut ne pas produire les résultats souhaités. Prenons l'exemple suivant :
string[] partNumbers = new string[] { "ABC10", "ABC1","ABC2", "ABC11","ABC10", "AB1", "AB2", "Ab11" }; var result = partNumbers.OrderBy(x => x);
Le résultat attendu ordonnerait les chaînes comme suit :
AB1 AB2 AB11 ...
Cependant, le résultat réel diffère car l'ordre des chaînes par défaut suit l'ordre lexicographique. Cela signifie que les valeurs numériques sont comparées de gauche à droite, conduisant à l'ordre suivant :
AB1 Ab11 AB2 ABC1 ABC10 ABC10 ABC11 ABC2
Pour obtenir le tri alphanumérique souhaité, nous devons modifier la logique de comparaison. Nous pouvons compléter la partie numérique de chaque chaîne avec un nombre spécifique de zéros. Cela garantit que les valeurs numériques sont comparées équitablement, quelle que soit leur longueur.
public static string PadNumbers(string input) { return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0')); } var result = partNumbers.OrderBy(x => PadNumbers(x));
Avec cet ordre modifié, les parties numériques des chaînes sont comparées en fonction de leurs valeurs complétées, ce qui conduit à l'ordre correct suivant :
AB1 AB2 AB11 ...
Notez que cette approche suppose un nombre maximum de chiffres pour les nombres en entrée. S'il y a des nombres avec plus de chiffres que le remplissage spécifié, le tri peut ne pas être précis.
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!