Maison >développement back-end >C++ >Comment trier correctement les chaînes alphanumériques en C# ?

Comment trier correctement les chaînes alphanumériques en C# ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-02 19:02:38791parcourir

How to Sort Alphanumeric Strings Correctly in C#?

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 interface :

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!

Déclaration:
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