Heim >Backend-Entwicklung >C++ >Wie sortiere ich alphanumerische Zeichenfolgen in C# richtig?
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
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!