Heim >Backend-Entwicklung >C++ >Wie sortiere ich alphanumerische Zeichenfolgen in C# richtig?

Wie sortiere ich alphanumerische Zeichenfolgen in C# richtig?

Barbara Streisand
Barbara StreisandOriginal
2025-01-02 19:02:38759Durchsuche

How to Sort Alphanumeric Strings Correctly in C#?

Zeichenfolgen alphanumerisch sortieren

In der Programmierung ist es oft notwendig, Daten nach bestimmten Kriterien zu sortieren. Ein häufiges Szenario ist das Sortieren von Zeichenfolgen, die sowohl alphabetische als auch numerische Zeichen enthalten können. Das naive Sortieren solcher Zeichenfolgen mithilfe der Standardreihenfolge führt jedoch möglicherweise nicht zu den gewünschten Ergebnissen.

Bedenken Sie den folgenden Codeausschnitt:

string[] things = new string[] { "105", "101", "102", "103", "90" };

foreach (var thing in things.OrderBy(x => x))
{
    Console.WriteLine(thing);
}

Dieser Code zielt darauf ab, ein Array von Zeichenfolgen zu sortieren numerisch,但得到的输出却是不正确的:

101, 102, 103, 105, 90

Anstatt die Zeichenfolgen nach ihrem numerischen Wert zu sortieren, werden sie in der Standardreihenfolge als Zeichenfolgen behandelt und alphabetisch sortiert, was zu der obigen Ausgabe führt.

Benutzerdefinierter Vergleicher zur Handhabung Numerische Zeichenfolgen

Um dieses Problem zu beheben, können wir einen benutzerdefinierten Vergleicher definieren, der sowohl alphabetische als auch numerische Zeichenfolgen verarbeiten kann. Die Idee besteht darin, Enumerable.OrderBy zu verwenden, wodurch wir einen benutzerdefinierten Vergleicher angeben können, um das Sortierverhalten zu steuern.

So können wir einen benutzerdefinierten Vergleicher mithilfe des IComparer implementieren. Schnittstelle:

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 _);
    }
}

Dieser Vergleicher prüft, ob beide Zeichenfolgen numerisch sind und sortiert sie entsprechend. Wenn nur eine Zeichenfolge numerisch ist, wird die alphabetische Zeichenfolge priorisiert.

Um den benutzerdefinierten Vergleicher zu verwenden, können wir den Code wie folgt ändern:

foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
{
    Console.WriteLine(thing);
}

Jetzt wird die Ausgabe korrekt sortiert sowohl alphabetisch als auch numerisch:

007, 90, bob, lauren, paul

Durch die Verwendung eines benutzerdefinierten Vergleichers können wir Zeichenfolgen, die numerische Zeichen enthalten, effektiv sortieren, ohne dass eine Konvertierung erforderlich ist sie in ganze Zahlen umwandeln, die anfängliche Herausforderung angehen und das gewünschte Sortierverhalten erreichen.

Das obige ist der detaillierte Inhalt vonWie sortiere ich alphanumerische Zeichenfolgen in C# richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn