Ich möchte String, der rekursives Array von Strings enthält, in ein Array mit Tiefe eins konvertieren.
Beispiel:
%Vor%Scheint ziemlich einfach. Aber ich komme aus dem funktionalen Hintergrund und kenne mich mit .NET Framework-Standardbibliotheken nicht so gut aus, so dass ich jedes Mal (ich habe 3 Mal von vorne angefangen) einfach nur hässlichen Code erhalte. Meine neueste Implementierung ist hier . Wie Sie sehen, ist es hässlich.
Also, was ist der C # Weg, dies zu tun?
@ojlovecd hat eine gute Antwort mit regulären Ausdrücken.
Allerdings ist seine Antwort übermäßig kompliziert, also hier ist meine ähnliche, einfachere Antwort.
Wenn Sie diesen Code verwenden, sehen Sie, dass StringToArray("[a, b, [c, [d, e]], f, [g, h], i]")
das folgende Array zurückgibt: ["a", "b", "[c, [d, e]]", "f", "[g, h]", "i"]
.
Weitere Informationen zu den ausgewogenen Gruppen, die ich für die Abstimmung ausgewogener Klammern verwendet habe, finden Sie unter Microsofts Dokumentation .
Aktualisieren :
Laut den Kommentaren, wenn Sie auch Zitate ausgleichen möchten, ist hier eine mögliche Änderung. (Beachten Sie, dass in C # die "
als ""
ausgeblendet ist). Ich habe auch Beschreibungen des Musters hinzugefügt, um es zu verdeutlichen:
Ehrlich gesagt würde ich diese Methode einfach in eine F # -Aufbau schreiben, da es wahrscheinlich viel einfacher ist. Wenn Sie sich die JavaScriptSerializer
-Implementierung in C # anschauen (mit einem Decompiler wie dotPeek oder reflector), können Sie sehen, wie unordentlich der Array-Parsing-Code für ein ähnliches Array in JSON ist. Zugegeben, dies muss mit einer viel vielfältigeren Palette von Token umgehen, aber Sie bekommen die Idee.
Hier ist ihre DeserializeList
-Implementierung, hässlicher als es normalerweise ist, wie die dekompilierte Version von dotPeek, nicht das Original, aber Sie bekommen die Idee. Das DeserializeInternal
würde in die Child-Liste zurückkehren.
Das rekursive Parsing wird in C # nicht so gut gehandhabt wie in F #.
Es gibt keinen echten "Standard" Weg dies zu tun. Beachten Sie, dass die Implementierung ziemlich unordentlich werden kann, wenn Sie alle Möglichkeiten berücksichtigen möchten. Ich würde etwas rekursives wie empfehlen:
%Vor%Obwohl Sie nicht auf Rekursivität beschränkt sind und immer auf eine einzelne Methode wie
zurückgreifen können %Vor%Was dir gut riecht