Autor Beitrag
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
dict.add("a"5);					

aber statt per Index über den "Key" indizieren:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Mi 29.07.09 12:50 
Pseudocode (weil ich keine Lust habe alles zu verfremden):

ausblenden volle Höhe 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

_________________
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.