Tri des chaînes par ordre alphabétique et numérique avec comparaison personnalisée
Cette question présente un défi dans le tri alphabétique d'un tableau de numéros de chaîne tout en considérant leurs valeurs numériques . Pour y parvenir, un comparateur personnalisé doit être implémenté pour remplacer la comparaison de chaînes par défaut.
Détails d'implémentation
Le code ci-dessous montre comment implémenter ce tri :
using System; using System.Collections.Generic; using System.Linq; namespace StringSort { class Program { static void Main(string[] args) { // Input array of string numbers string[] things = new string[] { "105", "101", "102", "103", "90" }; // Sort using custom comparer IEnumerable<string> sortedThings = things.OrderBy(x => x, new SemiNumericComparer()); // Print sorted array foreach (var thing in sortedThings) { Console.WriteLine(thing); } } public class SemiNumericComparer : IComparer<string> { // Check if a string is numeric public bool IsNumeric(string value) { return int.TryParse(value, out _); } // Compare two strings public int Compare(string s1, string s2) { const int S1GreaterThanS2 = 1; const int S2GreaterThanS1 = -1; // Check if both strings are numeric var IsNumeric1 = IsNumeric(s1); var IsNumeric2 = IsNumeric(s2); if (IsNumeric1 && IsNumeric2) { int i1 = Convert.ToInt32(s1); int i2 = Convert.ToInt32(s2); return i1.CompareTo(i2); } // If one string is numeric and the other is not, consider the numeric string greater if (IsNumeric1) return S2GreaterThanS1; if (IsNumeric2) return S1GreaterThanS2; // Otherwise, perform a case-insensitive alphabetical comparison return string.Compare(s1, s2, true, CultureInfo.InvariantCulture); } } } }
Logique de comparaison personnalisée
La classe SemiNumericComparer définit la logique de comparaison pour les chaînes. Il vérifie d'abord si les deux chaînes sont numériques à l'aide de la méthode IsNumeric. Si les deux sont numériques, il les compare numériquement. Si une seule chaîne est numérique, il considère que la chaîne numérique est supérieure. Pour les chaînes non numériques, il effectue une comparaison alphabétique insensible à la casse.
Lors de l'utilisation de ce comparateur avec Enumerable.OrderBy, le tableau de numéros de chaîne sera trié d'abord par valeur numérique, puis par ordre alphabétique pour les chaînes non numériques. . Le résultat de l'exemple ci-dessus sera :
90 101 102 103 105
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!