Wenn ich in C # eine string
durch eine andere teilen möchte, muss string
ich so etwas tun:
testString.Split(new string[] { "anotherString" }, StringSplitOptions.None);
Aus der überladenen String.Split
MSDN-Dokumentation können wir die Implementierung und den Grund für einen solchen Aufruf ersehen.
Ich komme aus Python und kann nur schwer richtig verstehen, warum ein solcher Aufruf erforderlich ist. Ich meine, ich könnte Regex.Split
eine ähnliche Syntax wie die Python-Implementierung verwenden, aber ich müsste dies auf Kosten einer geringeren Leistung (Einrichtungszeit) für alles Einfache tun .
Meine Frage ist also, warum zum Teufel können wir das nicht einfach tun:
testString.Split("anotherString");
Beachten Sie, dass ich weder einen Prototyp noch eine Implementierung vorschlage. Ich verstehe, warum Sie die obige Version unter Berücksichtigung der aktuellen API nicht implementieren konnten. Mein Ziel war es zu verstehen, warum eine solche API unter Berücksichtigung des Nutzens der obigen Syntax hätte erstellt werden können. Ab sofort scheint Flexibilität das Ziel der Strömung zu sein, String.Split
was Sinn macht, aber um ehrlich zu sein, dachte ich wirklich, dass es irgendwo eine Art Leistungsgewinn gibt. Ich schätze ich lag falsch.
quelle
testString.Split(",.;");
undtestString.Split(new Char [] {',', '.', ';',);
was ist nicht dasselbe?IEnumerable<char>
sodass der von Ihnen vorgeschlagene zusätzliche Prototyp in bestimmten Fällen möglicherweise nicht eindeutig ist (begrenzen Sie die gesamte Zeichenfolge oder die einzelnen Zeichen?). Nur eine Vermutung.testString.Split("anotherString");
bin ich ziemlich zuversichtlich zu sagen, dass das erwartete Verhalten darin bestand, die gesamte Zeichenfolge (anotherString
in diesem Fall) abzugrenzen .Antworten:
Manchmal ist es sinnvoll, mehr als ein Zeichen / eine Zeichenfolge aufzuteilen, sodass Sie mit der API ein Array bereitstellen können, das Ihnen maximale Flexibilität bietet. Im Fall von
char
s erhalten Sie sowohl eine einfache Syntax als auch Flexibilität, da der Parameter als markiert ist,params
damit Sie schreiben könnenSplit('x')
und nichtSplit(new[]{'x'})
.Warum gibt es keine ähnliche Option für Zeichenfolgen, mit der Sie schreiben können
Split("x")
?Dies ist möglicherweise eine unglückliche Folge der Gestaltung der API. Anfangs war es nur erlaubt, Zeichen aufzuteilen. Das Aufteilen auf Zeichenfolgen wurde in 2.0 hinzugefügt, wahrscheinlich weil die Implementierung komplexer ist. Das Hinzufügen
String.Split(string)
oderString.Split(string[])
Überladen war jedoch nicht möglich , da dies den AusdrucktestString.Split(null)
mehrdeutig machen und dieser Code nicht mehr kompilieren würde.testString.Split(null)
ist eigentlich eine ziemlich verbreitete Redewendung, da sie die Zeichenfolge in Leerzeichen aufteilt, sodass ein solcher Bruch zu weit verbreitet wäre, um akzeptabel zu sein.Die Verwendung eines
null
Parameters als Schalter für spezielles Verhalten wird heutzutage allgemein als schlechtes Design angesehen. Ich denke, es ist fair zu sagen, dass diese API nur fehlerhaft ist.Es gibt auch keine
Split(string[], Int32)
, wahrscheinlich aus einem ähnlichen Grund - es wäre mehrdeutig,Split(char[], Int32)
wenn der erste Parameter istnull
. Es gibt ähnliche Überladungen mit denStringSplitOptions
Parametern, aber diese wurden alle gleichzeitig in 2.0 hinzugefügt, sodass im vorhandenen Code keine Mehrdeutigkeit eingeführt wurde.Hinweis
Um klar zu sein, dies ist nur meine Hypothese, ich kenne das tatsächliche Denken der .net-Framework-Designer nicht.
quelle
Split(null)
das nutzlos ist, wenn Sie es erlaubenSplit("")
. Abgesehen von der Tatsache, dass es eine viel bessere Syntax ermöglichen würde, ist letztere sowieso ausführlicher ...String.Split(null)
wäre das Deaktivieren der Nullbarkeit von Basistypen nicht mehr mehrdeutig, sodass sie die Überlastung hinzufügen könntenDa ich nicht der Autor der Methoden bin, weiß ich nicht, warum diese Überladungen ausgewählt wurden. Hier sind jedoch zwei Dinge zu beachten:
Wenn Sie auf ein einzelnes Zeichen
public string[] Split(params char[] separator
aufteilen, kann die ) Version folgendermaßen verwendet werden:wie das
char[]
ist einparams
Parameter.Sie können hier ganz einfach Ihre eigene Erweiterungsmethode hinzufügen, um das zu erreichen, was Sie möchten:
und jetzt
testString.Split("anotherString");
wird für dich arbeiten.quelle
String
Klasse, beides wäre möglich. Liege ich falsch ?Verschiedene Sprachen haben etwas unterschiedliche Regeln für implizite Konvertierungen und Überladungen, und .NET Framework ist so konzipiert, dass es mit jeder von ihnen verwendet werden kann. Im
Option Strict Off
Dialekt von VB.NET kann ein Wert vom TypString
an eine Funktion übergeben werden, die einChar[]
Verhalten erwartet , das dem AufrufenToCharArray()
der Zeichenfolge entspricht.Ich denke, das Vernünftige wäre gewesen, separate Namen für
Split
(die ein einzelnesChar
oder akzeptierenString
) undSplitMulti
(die einChar[]
oder akzeptieren würdenString[]
) zu haben, aber .NET scheint manchmal die Verwendung von Überladung allein zu bevorzugen, um verschiedene Arten von Operationen auszuwählen. Leider kenne ich keine Möglichkeit, VerwendungsszenarienString.Split
zu berücksichtigen, bei denen verschiedene Arten von Trennzeichen unterschieden werden müssten, außer durch getrennte Aufteilung.Eine weitere Auslassung ist die Option, Trennzeichen beizubehalten, entweder am Ende der vorhergehenden Zeichenfolge oder am Anfang der folgenden Zeichenfolge, oder ungeradzahlige Array-Elemente als Trennzeichen zu verwenden, während geradzahlige Elemente die Dinge zwischen ihnen sind.
quelle