Maintenir l'ordre alphabétique tout en hiérarchisant les valeurs numériques dans les tableaux de chaînes
Le tri des chaînes par ordre alphabétique est une tâche standard, mais comment gérer les scénarios dans lesquels les chaînes représenter également des nombres tout en conservant l'ordre numérique ? Voici une solution qui répond à ce défi.
Considérez le code suivant :
string[] things= new string[] { "105", "101", "102", "103", "90" }; foreach (var thing in things.OrderBy(x => x)) { Console.WriteLine(thing); }
Ce code tente de trier un tableau de chaînes numériques par ordre alphabétique, mais le résultat n'est pas celui souhaité :
101, 102, 103, 105, 90
Pour obtenir le résultat attendu :
90, 101, 102, 103, 105
vous devez transmettre un comparateur personnalisé dans Commander par. Enumerable.OrderBy vous permet de spécifier un comparateur personnalisé pour le tri.
Voici une implémentation utilisant un SemiNumericComparer :
string[] things = new string[] { "paul", "bob", "lauren", "007", "90" }; foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer())) { Console.WriteLine(thing); }
La classe SemiNumericComparer définit une méthode pour déterminer si une chaîne est numérique et fournit une méthode de comparaison :
public class SemiNumericComparer: IComparer<string> { /// <summary> /// Method to determine if a string is a number /// </summary> /// <param name="value">String to test</param> /// <returns>True if numeric</returns> public static bool IsNumeric(string value) { return int.TryParse(value, out _); } /// <inheritdoc /> 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); } }
Lorsqu'il est appliqué au tableau de chaînes, le SemiNumericComparer trie les chaînes d'abord par ordre alphabétique, puis par valeur numérique, fournissant le résultat 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!