Heim > Backend-Entwicklung > C++ > Wie sortiere ich Zeichenfolgen alphabetisch und numerisch mithilfe eines benutzerdefinierten Vergleichers in C#?

Wie sortiere ich Zeichenfolgen alphabetisch und numerisch mithilfe eines benutzerdefinierten Vergleichers in C#?

Barbara Streisand
Freigeben: 2025-01-02 13:13:38
Original
368 Leute haben es durchsucht

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

Strings alphabetisch und numerisch mit benutzerdefiniertem Vergleich sortieren

Diese Frage stellt eine Herausforderung dar, wenn es darum geht, ein Array von String-Nummern alphabetisch zu sortieren und dabei ihre numerischen Werte zu berücksichtigen . Um dies zu erreichen, muss ein benutzerdefinierter Vergleicher implementiert werden, der den Standard-String-Vergleich überschreibt.

Implementierungsdetails

Der folgende Code zeigt, wie diese Sortierung implementiert wird:

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);
            }
        }
    }
}
Nach dem Login kopieren

Benutzerdefinierte Vergleichslogik

Der SemiNumericComparer Die Klasse definiert die Vergleichslogik für Zeichenfolgen. Zunächst wird mithilfe der IsNumeric-Methode überprüft, ob beide Zeichenfolgen numerisch sind. Wenn beide numerisch sind, werden sie numerisch verglichen. Wenn nur eine Zeichenfolge numerisch ist, wird die numerische Zeichenfolge als größer betrachtet. Bei nicht numerischen Zeichenfolgen wird ein alphabetischer Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung durchgeführt.

Bei Verwendung dieses Vergleichers mit Enumerable.OrderBy wird das Array der Zeichenfolgennummern zuerst nach numerischem Wert und dann bei nicht numerischen Zeichenfolgen alphabetisch sortiert . Die Ausgabe des obigen Beispiels lautet:

90
101
102
103
105
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie sortiere ich Zeichenfolgen alphabetisch und numerisch mithilfe eines benutzerdefinierten Vergleichers in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage