Entwickler-Ecke
Basistechnologien - Mehrdimensionales Array oder Record
ene - Mi 29.07.09 10:51
Titel: Mehrdimensionales Array oder Record
Moin,
ich brauche ein mehrdimensionales Array (eher eine ArrayList, weil es veränderlich ist) mit 2 Datentypen (string, int). Wie geht das in C#? Unter Delphi hätte ich einen Type Record draus gemacht und mir dann ein Array meines Types erzeugt. Geht das unter C# oder gibt es bessere Konstrukte?
Vielen Dank,
Jan
Kha - Mi 29.07.09 11:13
Eine eigene Klasse für die zwei Daten brauchst du auf jeden Fall. Mit List<List<Foo>> hättest du dann sowas wie ein zweidimensionales Array mit veränderbaren Dimensionen. Aber vielleicht finden wir noch eine bessere Lösung, wenn du mal beschreibst, was du eigentlich vorhast.
ene - Mi 29.07.09 11:32
Es geht dabei um das Addieren von Einzelteilen. In jedem Durchlauf ist die Anzahl an Einzelteilen variable und ein Faktor kommt auch ins Spiel. Ein Beispiel:
1. Durchlauf: 2 Komponenten (a=5, b=1200)
2. Durchlauf: 4 Komponenten (a=30, b=800, c=500, d=15)
3. Durchlauf: 6 Komponenten (a=30, c=200, d=15, e=600, f=400, g=200)
b ist das Gemenge jedes Durchlaufs.
Nun gehe ich dahin und muss mir a und b merken, im 2. Durchlauf habe ich die Komponenten a-d. c ist dann 500 * 1200/1345 (Summe a-d), d= 15*1200/1345. a= a + 30 *1200/1345.
Und nun kommt der 3. Durchlauf a= a+ 30*800/1445 und so weiter. Und das muss ich halt abbilden. Die Reihenfolge der Einzelteile ist leider auch nicht fix. Deswegen halt der etwas kompliziertere Aufbau.
Beim Googlen bin ich auf struct gestoßen, wäre das eine Alternative? Ich frage nur, weil ich mich mit diesen Dingen in C# noch nicht auseinandergesetzt habe :)
Kha - Mi 29.07.09 11:47
Ok, viel habe ich jetzt leider nicht verstanden :lol: . Aber vielleicht brauchst du doch keine eigene Klasse, sondern eher ein
Dictionary<string, int>. So einem kannst du wie einer List<T> Einträge hinzufügen:
aber statt per Index über den "Key" indizieren:
Wenn du so eines für jeden Durchlauf in einer Liste speicherst, hättest du letztendlich eine
List<Dictionary<string, int>>.
ene hat folgendes geschrieben : |
| Beim Googlen bin ich auf struct gestoßen, wäre das eine Alternative? |
Ja, struct entspricht einem Record: Beides sind Wertetypen. In C# solltest du allerdings immer erst an eine Klasse denken, denn die kann alles, was ein struct auch kann. Nur für wenige Typen eignen sich structs, einen
int würdest du beispielsweise ja lieber nicht als Klasse sehen ;) .
ene - Mi 29.07.09 11:56
Ok, dann schaue ich mal nach Dictionary, hört sich auf jeden Fall einfacher an :) Ist halt eine Rekursive Mengenkonsolidierung, wobei am Ende die Summe der Teilmengen herauskommt. Mal sehen, wie weit ich alleine komme :)
ene - Mi 29.07.09 12:50
Pseudocode (weil ich keine Lust habe alles zu verfremden):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| Dictionary<string, double> d = new Dictionary<string, double>();
private void Teilmengen(int Cid, string Pid) { double Charge = Vorgängergewicht(); double SummeGewicht = Gesamtgewicht(); double Faktor = Charge / SummeGewicht;
OdbcDataReader rs = q.ExecuteRead(s);
while (rs.Read()) { FillArray(rs[0].ToString(), Convert.ToDouble(rs[1]), Faktor); }
if (Vörgänger > 0) { Teilmengen(Vorgänger, Pid); } }
public void FillArray(string k, double Menge, double Faktor) { if (d.ContainsKey(k)) { d[k] = d[k] + Menge * Faktor;
} else { d.Add(k, Menge); } } |
Das mit dem Dictionary funktioniert Herr Vorragend und ist wesentlich einfacher als mein ursprüngliches Konstrukt :mrgreen: Ist zwar noch ein Rechenfehler drin, aber der ist ja nicht das Thema hier.
Vielen Dank!
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!