was ist besser?



  • Hallo,

    vielleicht eine etwas komische Frage...

    Ich will ein 2 dimensionales Array[4, 5] in eine ArrayList einlesen. Warum sei mal dahingestellt, ich brauch das. Diese neue ArrayList wird dann an eine Klasse übergeben in der dann weitergearbeitet werden soll.

    Das Ursprungsarray ist arUrsprung, das neue ist die ArrayList alNeu.

    Jetzt habe ich 2 Lösungsansätze.

    Es gibt 4 Maschinen und für jede Maschine 5 Parameter.

    Ich bekomme von einer externen Schnittstelle die Informationen über ein 2 dimensionales Array. Die 2. Dimension beinhaltet die Seriennummer, Bezeichnung, Standort, Preis und Aktivitätsflag, die 1.Dimension dient als Zähler.

    Nachdem diese Arraylist aufgebaut wurde, ist diese folgend initialisiert:

    Für 1.Ansatz

    allNeu[0] = "Serial1"
    allNeu[1] = "Maschine A"
    allNeu[2] = "München"
    allNeu[3] = "12.500"
    allNeu[4] = "1"

    allNeu[5] = "Serial2"
    allNeu[6] = "Maschine B"
    allNeu[7] = "München"
    allNeu[8] = "10.000"
    allNeu[9] = "1"

    allNeu[10] = "Serial3"
    allNeu[11] = "Maschine C"
    allNeu[12] = "München"
    allNeu[13] = "85.000"
    allNeu[14] = "0"

    allNeu[15] = "Serial4"
    allNeu[16] = "Maschine D"
    allNeu[17] = "München"
    allNeu[18] = "5.000"
    allNeu[19] = "1"

    Hier wird später das Ergebnis mit einer Prüfung auf einen 5 er Block, z.B mit einer Modulo Abfrage abgefragt um jeder Maschine die richtigen Werte zuzuweisen.

    Für 2.Anatz:

    allNeu[0] = „Serial1;Maschine A; München; 12.500; 1“;
    allNeu[1] = „Serial2;Maschine A; München; 10.000; 1“;
    allNeu[2] = „Serial3;Maschine B; München; 85.000; 0“;
    allNeu[3] = „Serial4;Maschine C; München; 5.000; 1“;

    Hier wird später das Ergebnis einzeln ausgelesen und der String gesplittet.

    Ansatz 1:

    for(i=0; i < arUrsprung.getupperbound(0); i++)
    {
        for(k=0; k < arUrsprung.getupperbound(1); k++)
        {
            alNeu.add(arUrsprung[i, k])
        }
    }
    

    In der Klasse für den 1.Ansatz in der es gebraucht wird dann Zugriff mit:

    alNeu[x]
    

    Ansatz 2:

    for(i)
    {
        alNeu.add(arUrsprung[i,0] + ";" + arUrsprung[i,1] + ";" + arUrsprung[i,2] + ";" + arUrsprung[i,3] ;
    }
    

    In der Klasse für den 2.Ansatz in der es gebraucht wird dann Zugriff mit:

    foreach (string s in alNeu)
    {
        string result = s;
    }
    string[] desiredstring = s.split(';');
    


  • Kurzer Nachtrag, das gehört noch mit zum oberen und ist die eigentliche Frage:

    Welcher Ansatz ist performanter, welcher logischer, welcher professioneller, welcher entspricht dem Standard?



  • Der erste Ansatz wird auf jeden Fall performanter sein, da Modulo um einiges schneller zu bewerkstelligen ist, als in einem string nach kommas zu suchen.

    Ich hätte aber noch eine dritte Idee:

    Warum schreibst du dir keine Klasse mit den 5 Attributen

    class MeineKlasse
    {
        public string Seriennummer;
        public string Bezeichnung;
        public string Preis;
        //...
    }
    
    //Speichern:
    ArrayList arNeu = new ArrayList();
    for (int i=0; i<15; i++)
    {
        MeineKlasse element = new MeineKlasse(allNeu[i + 0], allNeu[i + 1], allNeu[i + 2], allNeu[i + 3], allNeu[i + 4]);
        arNeu.add(element);
    }
    
    //Zugriff:
    Label1.Text = arNeu[0].Preis;
    //...
    


  • zum logischer und professioneller:
    Auch hier würde ich den ersten Ansatz verfolgen. Logisch mag er zwar auf Anhieb nicht erscheinen ("häh, warum %5"), aber alle Elemente mit Kommas aneinanderhängen, um sie später wieder an Hand der Kommas auseinander zu friemeln, ist keineswegs sinnvoll. Vor allem, weil du den zusammengesetzten String niemals in dieser Konstellation brauchst, sondern nur zum Speichern deiner Daten. Und für diesen Fall gibt es in C# wesentlich bessere und performantere Lösungen.
    Siehe zum Beispiel meine Klasse ;).

    Was mir da noch einfällt: Ist denn bei einer ArrayList die Reihenfolge gewährleistet. Also wenn ich was als 2. reinschreibe, kann ich dann davon ausgehen, dass es auch unter dem Index 1 erreichbar ist? Falls nicht, wird dein erster Ansatz nicht funktionieren.



  • Des mit der eigenen Klasse, bzw. bei einfachen Werten reicht auch nen Struct wenn man eher Wertetyp Verhalten erwartet, ist auf jeden Fall die bessere Variante.

    Wobei ich nicht wie cin_off den Weg über dein allNeu ArrayList gehen würde(wobei der Code zum speichern auch noch falsch ist), sondern gleich mit dem 2 dimensionalen Array arbeiten würde.


Anmelden zum Antworten