Entwickler-Ecke

Basistechnologien - Von einem Array ins nächste schreiben


sebastian1234 - Do 06.02.14 18:56
Titel: Von einem Array ins nächste schreiben
Hallo zusammen,

folgende Frage! Ich lese aus einem EXCEL File Daten und schreibe diese in ein Array. Dieses Array wird in der unten aufgeführt Methode weiterverarbeitet und es erhält neue Werte. Wie kann ich die neuen Werte den einzelnen Objekten (Unternehmen) wieder zuordnen?

Ausgangspunkt EXCEL File:
Unternehmen/Kennzahl1/Kennzahl2
1/10/20
2/30/40

1.Array Kunde:
1/10/20
2/30/40

Methode verarbeitet die Werte 10, 20, 30, 40! Bspw. 0,4; 0,6; 0,3; 0,1
Wie können die Werte in einem neu erstellten Array wieder den "Unternehmen" 1 und 2 zuteilt werden sodass folgendes Array entsteht...

1/0,4/0,6
2/0,3/0,1

Hier die Methode in der alles gemacht wird (wahrscheinlich nicht besonders gut von mir programmiert)


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:
34:
35:
36:
37:
38:
39:
40:
 
public static void Stanardisierung(double[][] kunde)
        {
            double Mittelwert = 0;
            double Standardabweichung = 0;
            double Summe = 0;
            double Anzahl = 0;
            double Test = 0;
            double Test1 = 0;
            double Array = 0;
            double Array1 = 0;

            for (int a = 0; a < kunde.Length; ++a)
            {
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    Summe += kunde[a][i];
                    Anzahl++;
                    Test1 += (Math.Pow(kunde[a][i], 2));
                }
            }

            Mittelwert = Summe / Anzahl;
            Test = Test1 / Anzahl;
            Standardabweichung = Math.Sqrt(Test);
            Console.WriteLine("Abweichung" + Test1);
            Console.WriteLine("Mittelwert" + Mittelwert);

            for (int a = 0; a < kunde.Length; ++a)
            {
                Console.WriteLine("Unternehmen"+kunde[a][0]);
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    Array = kunde[a][i] - Mittelwert;
                    Array1 = Array / Standardabweichung;
                    Console.WriteLine(Array1);
                    Array = 0;
                }
            }  
        }


In Array1 stehe die neu berechneten Werte!
Die Ausgabe im Terminal ist...

Unternehmen1
Wert1
Wert2
Unternehmen2
Wert1
Wert2

Diese müssten wieder in ein Array gebracht werden und zwar so wie es in die Methode reingekommen ist.

Viele Grüße!!!! und danke


Ralf Jansen - Do 06.02.14 19:18

Erstell dir einen Klon des Eingangsarray


C#-Quelltext
1:
double[,] kundeStandardabweichung = (double[,])kunde.Clone();                    


und schreibe den Wert den du berechneten hast in deiner Schleife an den selben Index zurück an dem du auch die Werte aus dem Kunde Array geholt hast also vermutlich


C#-Quelltext
1:
kundeStandardabweichung[a][i] = Array1;                    



Übrigens dein Naming ist ziemlich problematisch um nicht zu sagen kaum leserlich. Ich würde dir raten dich an die Standards von c# zu halten die machen am wenigsten Probleme und sind für uns am einfachsten lesbar. Zum Beispiel den double Array zu nennen geht schon unter grob fahrlässig. Den kann man mit der Klasse Array verwechseln, wenn einer aus dem Context bemerkt das das nicht sein kann würde er erstmal vermuten das es eine Property ist etc. Schreib Variablen klein und gib ihnen Namen die auch irgendwas mit dem Context zu tun haben in dem sie verwendet werden.


sebastian1234 - Mo 17.02.14 17:00

Hallo konnte jetzt eine Woche leider nichts machen! Beim wieder einarbeiten in den Quelltext bin ich nun auf folgendes Problem gestoßen... Ich will 3 checkboxen an der Oberfläche haben Standardisierung, distanzBerechnungCity, distanzBerechnungEukli.

Ich habe ein Problem wie ich die if Abfrage gestallten muss sodass zuerst gefragt wird ob die Werte standardisiert werden sollen ja oder nein und dann danach erst gewählt werden soll ob distanzBerechnunCity und distanzBerechnunEkli...

EDIT: Wie schaffe ich es die checkbox1 und checkbox2 Werte nicht nur in der Form1 anzuwenden sondern auch in der DistanzenBerechnen klasse???


sebastian1234 - Mo 17.02.14 18:39

Ich will mal was genauer werden!

Im ersten if-Teil wird eine Abfrage hinsichtlich StandardisierungCheckBox gemacht. Ist diese Abfrage "gecheckt" soll zuerst die Methode Stanardisierung aufgerufen werden, welche die Daten standardisiert. Innerhalb dieser Methode möchte ich dann eine weitere if Abfrage machen die dann entweder die distanzBerechnungCity oder DistanzBerechnungEukli aufruft je nachdem wie an der Oberfläche entweder checkbox CityBlockCheckBox oder EuklidischCheckBox ausgewählt wurde. Wie kann ich die "gecheckten" Werte von CityBlockCheckBox oder EuklidischCheckBox an die Methode Stanardisierung übergeben.


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:
if (StandardisierungCheckBox.Checked)
            {
                double[][] kunde = dt.Rows.OfType<DataRow>().Select(x => x.ItemArray.Cast<double>().ToArray()).ToArray();
                
                if (CityBlockCheckBox.Checked)
                {
                    DistanzenBerechnen.Stanardisierung(kunde);
                    
                }
                if (EuklidischCheckBox.Checked)
                {
                    DistanzenBerechnen.Stanardisierung(kunde);
                }
            }
            else
            {
                double[][] kunde = dt.Rows.OfType<DataRow>().Select(x => x.ItemArray.Cast<double>().ToArray()).ToArray();
                if (CityBlockCheckBox.Checked)
                {
                    DistanzenBerechnen.distanzBerechnungCity(kunde);
                }
                if (EuklidischCheckBox.Checked)
                {
                    DistanzenBerechnen.distanzBerechnungEukli(kunde);
                }
            }



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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
public static void Stanardisierung(double[][] kunde)
        {
            double Mittelwert = 0;
            double Standardabweichung = 0;
            double Summe = 0;
            double Anzahl = 0;
            double StandardabweichungOhneWurzel = 0;
            double SummeQuadrat = 0;
            double AufDemBruchFormelStandardisierungKunde = 0;
            double StandardisierungKunde = 0;

            for (int a = 0; a < kunde.Length; ++a)
            {
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    Summe += kunde[a][i];
                    Anzahl++;
                    SummeQuadrat += (Math.Pow(kunde[a][i], 2));
                }
            }

            Mittelwert = Summe / Anzahl;
            StandardabweichungOhneWurzel = SummeQuadrat / Anzahl;
            Standardabweichung = Math.Sqrt(StandardabweichungOhneWurzel);
            
            Console.WriteLine("Mittelwert " + Mittelwert);
            Console.WriteLine("Standardabweichung " + Standardabweichung);
            Console.WriteLine("");

            for (int a = 0; a < kunde.Length; ++a)
            {
                Console.WriteLine("Unternehmen"+kunde[a][0]);
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    AufDemBruchFormelStandardisierungKunde = kunde[a][i] - Mittelwert;
                    StandardisierungKunde = AufDemBruchFormelStandardisierungKunde / Standardabweichung;
                    Console.WriteLine(StandardisierungKunde);
                    AufDemBruchFormelStandardisierungKunde = 0;
                }

                // Hier würde ich vllt. die If Abfrage einbauen... 
                
            }  
        }


Ralf Jansen - Mo 17.02.14 18:51

Zitat:
Wie kann ich die "gecheckten" Werte von CityBlockCheckBox oder EuklidischCheckBox an die Methode Stanardisierung übergeben.


Als Parameter? Hast du ja mit dem kunde Array auch gemacht.


sebastian1234 - Mo 17.02.14 18:56

ich habe eben versucht das in einem int und double zu speichern was allerdings nicht geklappt hat. Auch ist die Unterscheidung zwischen CityBlockCheckBox oder EuklidischCheckBox mir nicht wirklich klar... Aber ich versuche nochmal


Ralf Jansen - Mo 17.02.14 19:00

int, double???? Ein Checkbox liefert maximal einen Boolean.


sebastian1234 - Di 18.02.14 13:10

Ja stimmt boolean! Gibt ja nur 2 Zustände. Trotzdem ist mir die Verarbeitung bzw. die Unterscheidung was jetzt "gecheckt" ist nicht wirklich klar...

Habe die Übergabe der Parameter jetzt so gestaltet...


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
if (StandardisierungCheckBox.Checked)
            {
                double[][] kunde = dt.Rows.OfType<DataRow>().Select(x => x.ItemArray.Cast<double>().ToArray()).ToArray();
                Boolean check;

                if (CityBlockCheckBox.Checked)
                {
                    check = CityBlockCheckBox.Checked;
                    DistanzenBerechnen.Stanardisierung(kunde, check);
                    
                }
                if (EuklidischCheckBox.Checked)
                {
                    check = EuklidischCheckBox.Checked;
                    DistanzenBerechnen.Stanardisierung(kunde, check);
                }
            }


Die Methode in der die Parameter ankommen sieht so aus...

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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
public static void Stanardisierung(double[][] kunde, Boolean check)
        {
            double Mittelwert = 0;
            double Standardabweichung = 0;
            double Summe = 0;
            double Anzahl = 0;
            double StandardabweichungOhneWurzel = 0;
            double SummeQuadrat = 0;
            double AufDemBruchFormelStandardisierungKunde = 0;
            double StandardisierungKunde = 0;

            for (int a = 0; a < kunde.Length; ++a)
            {
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    Summe += kunde[a][i];
                    Anzahl++;
                    SummeQuadrat += (Math.Pow(kunde[a][i], 2));
                }
            }

            Mittelwert = Summe / Anzahl;
            StandardabweichungOhneWurzel = SummeQuadrat / Anzahl;
            Standardabweichung = Math.Sqrt(StandardabweichungOhneWurzel);
            
            Console.WriteLine("Mittelwert " + Mittelwert);
            Console.WriteLine("Standardabweichung " + Standardabweichung);
            Console.WriteLine("");

            for (int a = 0; a < kunde.Length; ++a)
            {
                Console.WriteLine("Unternehmen"+kunde[a][0]);
                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    AufDemBruchFormelStandardisierungKunde = kunde[a][i] - Mittelwert;
                    StandardisierungKunde = AufDemBruchFormelStandardisierungKunde / Standardabweichung;
                    Console.WriteLine(StandardisierungKunde);
                    AufDemBruchFormelStandardisierungKunde = 0;
                }  
            }
            /*if (check == CityBlockCheckBox.Checked)
                 * {
                 *  ‹bergeben Array an Methode distanzBerechnungCity...
                 * }
                 *if (check == EuklidischCheckBox.Checked)
                 *{
                 *  ‹bergebe Array an Methode distanzBerechnungEukli...
                 *}*/

        }


Ich weiß halt nicht genau wie ich jetzt die Unterscheidung zwischen CityBlockCheckBox und EuklidischChechkBox hinbekommen sollen. Weil doch in dem boolean lediglich true oder false gespeichert wird...oder? Aber dann fehlt der Bezug zu CityBlockCheckBox oder EuklidischCheckBox.


Th69 - Di 18.02.14 13:28

Hallo,

stehst du irgendwie auf dem Schlauch heute? ;-)

Klar kannst du mit dem einen boolschen Parameter nur einen Wert abfragen. Also wirst du wohl beide boolschen Werte an die Methode übergeben müssen...

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if (StandardisierungCheckBox.Checked)
{
    double[][] kunde = dt.Rows.OfType<DataRow>().Select(x => x.ItemArray.Cast<double>().ToArray()).ToArray();

    bool checkCity = CityBlockCheckBox.Checked;
    bool checkEuklid = EuklidischCheckBox.Checked;

    DistanzenBerechnen.Standardisierung(kunde, checkCity, checkEuklid);
}

Und dann in der Methode Standardisierung (ich kaufe ein 'd') die Abfrage auf diese beiden Parameter durchführen.


sebastian1234 - Di 18.02.14 14:45

Ja ich weiß auch nicht wahrscheinlich einfach Dummheit =)

Auf jeden Fall habe ich es jetzt hinbekommen und das Problem mit dem Array! Vielen Dank!

Nur noch eine kurze Frage bzgl. Checkboxen... Wenn ich an der Oberfläche 2 Checkboxen habe, es aber so sein soll, dass von diesen beiden immer nur eine angeklickt werden darf, wie kann ich das einstellen? Also quasi XOR!


Christian S. - Di 18.02.14 14:54

Dazu benutzt man dann keine CheckBox, sondern RadioButtons. Da ist dann automatisch immer nur einer pro Gruppe ausgewählt und es ist auch das UI-Element, was ein Windows-Nutzer dafür erwartet.


sebastian1234 - Di 18.02.14 15:10

Wunderbar vielen danke klappt!!!