Maison > développement back-end > C++ > Comment trier les chaînes par ordre alphabétique et numérique à l'aide d'un comparateur personnalisé en C# ?

Comment trier les chaînes par ordre alphabétique et numérique à l'aide d'un comparateur personnalisé en C# ?

Barbara Streisand
Libérer: 2025-01-02 13:13:38
original
368 Les gens l'ont consulté

How to Sort Strings Alphabetically and Numerically Using a Custom Comparer in C#?

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);
            }
        }
    }
}
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal