Autor |
Beitrag |
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Mi 29.07.09 10:51
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
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: 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 
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 29.07.09 11:47
Ok, viel habe ich jetzt leider nicht verstanden  . 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:
C#-Quelltext
aber statt per Index über den "Key" indizieren:
C#-Quelltext
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 
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: 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 
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
ene 
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Mi 29.07.09 12:50
Pseudocode (weil ich keine Lust habe alles zu verfremden):
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  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
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
|