Analyse eines Strings, der ein Array enthält

8

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?

    
dijxtra 01.11.2011, 01:23
quelle

5 Antworten

5

@ojlovecd hat eine gute Antwort mit regulären Ausdrücken.
Allerdings ist seine Antwort übermäßig kompliziert, also hier ist meine ähnliche, einfachere Antwort.

%Vor%

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:

%Vor%     
Scott Rippey 01.11.2011, 22:19
quelle
2

mit Regex, kann es dein Problem lösen:

%Vor%     
ojlovecd 01.11.2011 02:27
quelle
0

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.

%Vor%

Das rekursive Parsing wird in C # nicht so gut gehandhabt wie in F #.

    
Paul Tyng 01.11.2011 01:41
quelle
0

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

    
Polity 01.11.2011 02:23
quelle
0
%Vor%     
BLUEPIXY 01.11.2011 13:33
quelle

Tags und Links