Multidimensionale dynamische Arrays?

ZeuX

Grünschnabel
Hallo!

Schon gleichnachdem mein letztes Problem gelöst wurde, stehe ich vor dem nächsten und komme schon seit einiger Zeit nicht mehr weiter.
Ich brauche für die Ausgabe ein in den Dimensionen dynamisches und in der Laenge dynamisches Array.
Also im Grunde eine Mischung aus Arraylist und JaggedArrays.
Ich habe schnell ein Diagramm zusammengebastelt um das grafisch darzustellen.

Verwendungszweck: Eine Klasse die HTML Templates verarbeitet.
Also im Grunde nichts anderes als das was PHP hier im Forum macht.

Ist so ein Array überhaupt möglich mit C# oder sollte ich mich nach einer anderen Lösung umsehen?

mfG ZeuX
 

Anhänge

  • 25721attachment.jpg
    25721attachment.jpg
    47,2 KB · Aufrufe: 26
Schau Dir mal diesen Artikel von TheCodeProject an:
Working with collections in the .NET Framework

Ich währ für eine Objekthirarchie wo die untergeordneten Objekte in simplen ArrayLists untergebracht werden.
//Edit:
Ich sehe aber grad keine meheren Objekte die einem Objekt untergeordnet sind.
Daher denke ich sollte eine Objekthirarchie genügen.
 
Zuletzt bearbeitet:
hey, den Artikel hab ich erst gestern gesucht oO

aber das Problem dabei ist, die Anzhal der untergeordneten Objekte ist auch dynamisch.

Ich habe schon einiges probiert.
Nur wenn ich nicht alles in eine oder nur eine handvoll Variablen speichere, komme ich irgendwann mit der Verwaltung nicht mehr zurande.
Ich muss bei der Auswertung der Daten alle gleichnamigen Blöcke beisammenhaben um sie auch dementsprechend oft zu wiederholen.
Dafür würde sich eine SortedList eignen, nur dann auch noch die Verknüpfung zu n Child-Blöcken, die wieder entweder weitere Childblöcke, ein assoziatives Array oder beides beinhalten können, zu behalten wird sehr schwer. Zumindest sehe ich kaum einen Weg das hinzubekommen.


//Edit:
da habe ich wohl ein paar Linien vergessen im Diagramm...
die zwei Hauptblöcke sind ebenfalls verbunden...
und die Anzahl der root-Blöcke ist auch dynamisch...

Ein kurzes Beispiel:
eine for-Schleife ruft die Funktion AddBlockVars x-mal auf, übergeben werden ein String mit dem Blocknamen und eine NameValueCollection(oä), wobei der Key den Variablennamen im Template darstellt und der Wert den Wert.
Das war die root-Ebene, später im Code kommt die nächste for-Schleife, sie ruft wieder diese Funktionauf und übergibt den 1. Blocknamen + "." + den neuen namen und wieder eine NameValueCollection...
das kann n mal so laufen....

//Edit2:
wie gesagt, JaggedArrays kommen der Sache schon wirklich nahe, das einzige Problem dass ich mit ihnen habe ist dass die Länge ihrer untergeordneten Arrays nicht nachträglich geändert werden kann...
und slbst wenn der Zugriff auf inneinander verschachtelte Arraylists nicht so kompliziert waere scheiden sie auch aus, da ich sie nicht einfach so aus dem ncihts während der Laufzeit erstellen kann.
 
Zuletzt bearbeitet:
Mal eine Frage, kann es sein das alles in Arrays liegt wo wiederum Arrays für die einzelnen Werte verwendet werden?
Warum so kompliziert? Ich hab selber vor kurzem eine HTML-Template-Engine fertig gestellt.

Ich beschreib Dir mal kurz den Aufbau.
Die Templates hab ich in Form eines Archivs in dem sich ein XML-Config-File,
ein XML-File für die Beschriftungen und die Template-Files (HTML, CSS) befínden.
Das XML-Config-File enthält eine File-List wo alle enthaltenen Template-Files aufgeführt werden.
Eine Item-List enthält alle zu erzetzenden Variablen samt der Information wo sie zu ersetzen sind (die Namen der File-List).
Und zusätzlich eine Resource-List die angibt, in welchen Sprachen die Beschriftungen vorhanden sind.

Ich lese das Config-File ein und Erzeuge aus den enthaltenen Items Objekte und füge sie in Hashtables ein.
Danach habe ich eine File-List eine Item-List und eine ResourceList.

Ich gehe die File-List durch und danach die Item-List und erzetze alles was zu ersetzen ist.
Du könntest Dir in deinem Fall zusätzlich noch eine Valuelist anlegen...

Nachdem ein Template-File fertig ist, scheib ich es in seinen Bestimmungsort.

Der Vorteil von dem Ganzen? Du kanns unendlich unterschiedliche Templates mit ein und der selben Logik verarbeiten. ;-)

Wenn die Grafik dein Problem nun darstellt, kann ich ja mal versuchen eine rudiemtäre Objekthirarchie daraus zu bauen.
Sag Bescheid.
 
bei der Grafik habe ich leider einige Verbindungen vergessen (auf dem Raster war konnte ich noch nicht wirklich gut erkennen wo ein Strich ist und wo nicht.)

Ja, es sind Arrays in Arrays... aber es ist von vornherein nciht festgelegt wie tief es gehen soll, also wieviele Arrays in den Arrays drinnen sein sollen UND es ist nciht festgelgt wie Lang die einzelnen Arrays sind, da immer wieder estwas dazukommen kann...

Habe ich alles richtig verstanden wenn ich sage dass in den Templates "nur" eine bestimmte Zeichenfolge durch eine andere ersetzt wird?
Das ist aber nich ganz das was ich brauche, denn das habe ich schon.
Ein Auszug aus einer Templatedatei des phpBB:
HTML:
<!-- BEGIN catrow -->
<tr>
<td class="cat" colspan="3"><a href="{catrow.U_VIEWCAT}">{catrow.CAT_DESC}</a></td>
<td class="rowpic" colspan="3"><img src="http://www.tutorials.de/forum/images/spacer.gif" alt="" width="295" height="12" /></td>
</tr>
<!-- BEGIN forumrow -->
<tr>
<td class="row1" height="45" align="center">
{catrow.forumrow.S_MARK_LINK_START} 
<img src="{catrow.forumrow.FORUM_FOLDER_IMG}" id="forumimage_{catrow.forumrow.FORUM_ID}" alt="{catrow.forumrow.L_FORUM_FOLDER_ALT}" title="{catrow.forumrow.L_FORUM_FOLDER_ALT}" border="0" />{catrow.forumrow.S_MARK_LINK_END}
</td></tr>
<!-- END forumrow -->
<!-- END catrow -->
und mir geht es jetzt in dem Fall um eben diese Blöcke: "catrow" und "forumrow".
Für jeden Aufruf von
PHP:
$template->assign_block_vars('catrow', array(
				'CAT_ID' => $cat_id,
				'CAT_DESC' => $category_rows[$i]['cat_title'],
				'U_VIEWCAT' => append_sid("index.$phpEx?" . POST_CAT_URL . "=$cat_id"))
			);
der Funktion "assign_block_vars" wird "catrow" wiederholt - inklusive "forumrow", welches wiederum sooft wiederholt wird wie es mit
PHP:
$template->assign_block_vars('catrow.forumrow',	array(
								'ROW_COLOR' => '#' . $row_color,
								'ROW_CLASS' => $row_class,
aufgerufen wurde und beide Blöcke ihrerseits ersetzten ihre Variablen(die bei jeden Durchlauf einen anderen Wert haben können).
(Es können beliebig viele Blöcke ineinander verschachtelt werden...)
Die Funktion "assign_block_vars" speichert die Daten dann in ein Array das in allen Belangen dynamisch ist.
Der Kommentar zu dem Array:
PHP:
	// variable that holds all the data we'll be substituting into
	// the compiled templates.
	// ...
	// This will end up being a multi-dimensional array like this:
	// _tpldata[block.][iteration#][child.][iteration#][child2.][iteration#][variablename] == value
	// if it's a root-level variable, it'll be like this:
	//_tpldata['.'][0][varname] == value


ich weiß nicht inwieweit du mit PHP in Berührung gekommen bist, aber verstehen wirst du es ja ;)
ich hoffe das hilft zum Verständnis
Alex
 
Ja, es sind Arrays in Arrays... aber es ist von vornherein nciht festgelegt wie tief es gehen soll, also wieviele Arrays in den Arrays drinnen sein sollen UND es ist nciht festgelgt wie Lang die einzelnen Arrays sind, da immer wieder estwas dazukommen kann...
Ohje, so würd ich das nicht angehen... Das währ mir zu unübersichtlich.
Aber da Du das schon so vorgeben hast, wird sich das wohl such nicht ändern lassen.
Habe ich alles richtig verstanden wenn ich sage dass in den Templates "nur" eine bestimmte Zeichenfolge durch eine andere ersetzt wird?
Das ist aber nich ganz das was ich brauche, denn das habe ich schon.
Ja das meinte ich. Anders geht es ja auch schlecht. :D

Du musst es schaffen während des durchgehens durch die Datensätze gleichzeitig das etsprechende Template abzurattern.
Mach es index- oder schlüssel-orientiert, damit Du die Inhalte zuordnen kannst.
Versuch Ordnung hinein zu bringen und Ebene für Ebene durch zuwandern.
Implementiere Objekte die eine Ebene abarbeiten und die ganzen Teilaufgaben dafür erledigen.
Somit schaffst einen übersichtlichen Aufbau. :)

Ich kann mich ehrlich gesagt nicht dazu beitragen, da ich mich grad nicht besonders gut heinein versetzen,
weil mir die Informationen fehlen wie das ganze drum herrum aufgebaut ist.
Ich hab ja auch noch was zu tun und das würde jetzt meinen Zeitlichen Rahmen sprengen,
auch wenn ich die Informationen hätte... ;)
 
ZeuX hat gesagt.:
Ist so ein Array überhaupt möglich mit C# oder sollte ich mich nach einer anderen Lösung umsehen?
habe ich nicht umsonst geschrieben :)

Bisher hatte ich es so dass erst nach dem Aufrufen der Funktion "Parse()" alles ersetzt wird...
Ich hab ja auch noch was zu tun und das würde jetzt meinen Zeitlichen Rahmen sprengen,
auch wenn ich die Informationen hätte...
ich habe auch nicht erwartet dass jemand seine Zeit opfert.

Du musst es schaffen während des durchgehens durch die Datensätze gleichzeitig das etsprechende Template abzurattern.
Mach es index- oder schlüssel-orientiert, damit Du die Inhalte zuordnen kannst.
Versuch Ordnung hinein zu bringen und Ebene für Ebene durch zuwandern.
Implementiere Objekte die eine Ebene abarbeiten und die ganzen Teilaufgaben dafür erledigen.
Somit schaffst einen übersichtlichen Aufbau.
Werde ich wohl machen müssen.
Und nicht ganz so viel Freiraum lassen (Anzahl an SubEbenen begrenzen, Maximale Anzahl an Variablen einführen etc...)
---
wobei mir jetzt aber eine Idee gekommen ist,
ich könnte die Daten temporär in ein XML-Objekt schreiben!
Ich habe eigentlich nichts anderes beschrieben als XML...
Am Ende auslesen und abarbeiten.

Sollte eigentlich funtkionieren, ich probier es mal aus :)
 
Zuletzt bearbeitet:
Ich hab das ganze jetzt nicht mit XML gelöst, sondern anders. (XML-Kenntnisse reichten nicht aus)
Wenn auch ähnlich.

Also,
Alle Blöcke kommen in eine NameValueCollection wobei der Key den Blocknamen darstellt und Value ist die Anzahl der Iterationen
Und die Variablen kommen ebenfalls in eine NameValueColelction. Der Key ist der Name der Variable (so wie sie im Template steht) und Value ist dann kogischerweise der Wert.
Unterscheiden welche Variable zu welchen Block gehoert und zur wievielten Iteration habe ich so gelöst:
Im Key der NameValueCollection wird immer der Blockname + "." + Iteration vor den eigentlichen Variablennamen eingefuegt.

ZeuX
 
Zurück