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<stringint>. So einem kannst du wie einer List<T> Einträge hinzufügen:

C#-Quelltext
1:
dict.add("a"5);                    

aber statt per Index über den "Key" indizieren:

C#-Quelltext
1:
dict["a"]                    

Wenn du so eines für jeden Durchlauf in einer Liste speicherst, hättest du letztendlich eine List<Dictionary<stringint>>.

user profile iconene hat folgendes geschrieben Zum zitierten Posting springen:
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<stringdouble> d = new Dictionary<stringdouble>();

private void Teilmengen(int Cid, string Pid)
{          
    double Charge = Vorgängergewicht();
    double SummeGewicht = Gesamtgewicht();
    double Faktor = Charge / SummeGewicht;

    //Einzelteile holen
    OdbcDataReader rs = q.ExecuteRead(s);

    while (rs.Read())
    {
        FillArray(rs[0].ToString(), Convert.ToDouble(rs[1]), Faktor);
    }

    //Rekursion
    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 user profile iconChristian S.: Code- durch C#-Tags ersetzt