Tri des chaînes par ordre alphanumérique
En programmation, il est souvent nécessaire de trier les données en fonction de critères spécifiques. Un scénario courant consiste à trier des chaînes pouvant contenir à la fois des caractères alphabétiques et numériques. Cependant, trier naïvement de telles chaînes en utilisant l'ordre par défaut peut ne pas donner les résultats souhaités.
Considérez l'extrait de code suivant :
string[] things = new string[] { "105", "101", "102", "103", "90" }; foreach (var thing in things.OrderBy(x => x)) { Console.WriteLine(thing); }
Ce code vise à trier un tableau de chaînes numériquement,但得到的输出却是不正确的:
101, 102, 103, 105, 90
Au lieu de trier les chaînes en fonction de leur valeur numérique, l'ordre par défaut les traite comme des chaînes et les trie par ordre alphabétique, ce qui donne le résultat ci-dessus.
Comparateur personnalisé pour gérer les chiffres Chaînes
Pour résoudre ce problème, nous pouvons définir un comparateur personnalisé capable de gérer à la fois les chaînes alphabétiques et numériques. L'idée est d'utiliser Enumerable.OrderBy, qui nous permet de spécifier un comparateur personnalisé pour contrôler le comportement de tri.
Voici comment nous pouvons implémenter un comparateur personnalisé à l'aide de l'outil IComparer
public class SemiNumericComparer : IComparer<string> { public int Compare(string s1, string s2) { const int S1GreaterThanS2 = 1; const int S2GreaterThanS1 = -1; var IsNumeric1 = IsNumeric(s1); var IsNumeric2 = IsNumeric(s2); if (IsNumeric1 && IsNumeric2) { var i1 = Convert.ToInt32(s1); var i2 = Convert.ToInt32(s2); if (i1 > i2) { return S1GreaterThanS2; } if (i1 < i2) { return S2GreaterThanS1; } return 0; } if (IsNumeric1) { return S2GreaterThanS1; } if (IsNumeric2) { return S1GreaterThanS2; } return string.Compare(s1, s2, true, CultureInfo.InvariantCulture); } public static bool IsNumeric(string value) { return int.TryParse(value, out _); } }
Ce comparateur vérifie si les deux chaînes sont numériques et les trie en conséquence. Si une seule chaîne est numérique, elle donne la priorité à la chaîne alphabétique.
Pour utiliser le comparateur personnalisé, nous pouvons modifier le code comme suit :
foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); }
Maintenant, la sortie sera correctement triée à la fois alphabétique et numérique :
007, 90, bob, lauren, paul
En utilisant un comparateur personnalisé, nous pouvons trier efficacement les chaînes contenant des caractères numériques sans avoir besoin de les convertir en nombres entiers, relevant le défi initial et obtenant le comportement de tri souhaité.
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!