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