Autor Beitrag
gervacio
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 22.10.08 13:42 
Hallo Leute, hab ne Frage..

ich habe hier eine Funktion in der ich einen Parameter (index) erwarte, dieser intwert wird aus einer Textdatei ausgelesen.. Ich will aber ein mehrdimensionales Feld, die sich beliebig erweitert..
habs ihr ne idee wie ich das anstellen soll?


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public Kunde neu_Kunde(int index)
        {
            Kunde person = new Kunde( );
            k2[ index ] = person;
            return person;
        }


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mi 22.10.2008 um 13:47
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 22.10.08 14:05 
Hallo,

Array, das "sich beliebig erweitert" ist ein Widerspruch in sich: Arrays haben grundsätzlich eine feste Größe, die sich nur umständlich ändern lässt. Stattdessen ist List<T>, also z.B. List<int> oder List<Person> zu verwenden.

Wie es mehrdimensional zu machen ist, hängt von der konkreten Anforderung. Eine Möglichkeit ist Dictionary<T, U>.

Für weitere Hinweise werden weitere Informationen benötigt.

Gruß Jürgen
gervacio Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 23.10.08 15:52 
hi Jütho, hab ne Arraylist benützt und es funzt hervoragend! Danke dir dennoch!
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 23.10.08 15:59 
user profile icongervacio hat folgendes geschrieben Zum zitierten Posting springen:
hi Jütho, hab ne Arraylist benützt und es funzt hervoragend! Danke dir dennoch!
Argh :autsch: JüTho hat nicht umsonst die List<T> vorgeschlagen! Die ArrayList ist veraltet und sollte nicht mehr benutzt werden, es sei denn es geht wirklich überhaupt nicht anders.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 23.10.08 16:09 
Nun ja, ArrayList ist eine Notlösung. List<T> ist aber unbedingt vorzuziehen, weil deren Elemente immer den richtigen Typ haben und keine anderen Elemente eingefügt werden können. Bei ArrayList kann alles eingefügt werden, ohne dass der Compiler meckert, und die Elemente, die man auslesen will, müssen immer in den passenden Typ konvertiert werden. Das wird alles bei List<T> vermieden.

Ungünstig ist dies:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
//  einfügen:
ArrayList list = new ArrayList();
list.Add(new Person(...));
list.Add("JüTho");                    
list.Add(17);
//  auslesen:
Person person0 = list[0as person;   //  klappt
Person person1 = list[0];  //  Compiler meckert
Person person2 = list[2as person;   //  klappt beim Compiler und zur Laufzeit
MessageBox.Show(person2.Name);        //  knallt, weil person2 == null

Sicheres Arbeiten geht mit List<T>:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
List<Person> list = new List<Person>();
list.Add(new Person(...));
list.Add("JüTho");         //  Compiler meckert, also Funktionssicherheit
//  auslesen            
Person person1 = list[0];  //  Compiler meckert NICHT, direkte Zuordnung möglich

Gruß Jürgen
gervacio Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 23.10.08 17:08 
So sieht mein Code erstmal aus

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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;

namespace Kontenverwaltung
{
    class Program
    {
        static TextReader MyInput;
        static TextReader OriginalStdin;

        static void Main(string[] args)
        {
            int AnzahlKonten;
            string KontoAuswahl;
            string sparKo = "Sie haben ein [Sparkonto] gewählt ";
            string giroKo = "Sie haben ein [GiroKonto] gewählt";

            // Redirect ist eine Methode die auf die Textdatei zugreift

#if REDIRECT
            RedirectInput("input.txt");
#endif

            int Anzahl_Kunden = Convert.ToInt32(MyInput.ReadLine());            
            Kunde person = new Kunde( );
            ArrayList abc = new ArrayList( );

            //KundenSammlung abc = new KundenSammlung(Anzahl_Kunden);

            KundenKonto neu_konto = new KundenKonto( );
            ArrayList cde = new ArrayList();
            //KundenKontoSammlung cde = new KundenKontoSammlung(AnzahlKonten);


            for(int i = 0; i < Anzahl_Kunden; i++)
            {
                //person = abc.neu_Kunde(i);
                person.KundenID = person.Zufallszahl( );
                person.Name = MyInput.ReadLine( );
                person.Vorname = MyInput.ReadLine( );
                person.Email = MyInput.ReadLine( );
                abc.Add(person);
                
                    try
                    {
                        {
                            AnzahlKonten = Convert.ToInt32(MyInput.ReadLine());
                            if(AnzahlKonten < 1)
                            {
                                Console.Write("Sorry wir können für Sie kein konto anlegen");
                                AnwendungSchliessen( );
                            }

                            Console.Write("\nWelchen Kontotyp soll eingerichtet werden?\n\nGeben sie:\n\n*[G] für [GiroKonto]\n*[S] für [Sparkonto]\n\n");

                            KontoAuswahl = MyInput.ReadLine( ).ToUpper( );// Giro oder Sparkonto

                            switch(KontoAuswahl)
                            {
                                case "G":
                                    Console.Write(giroKo + "\n\n");
                                    if(AnzahlKonten > 0)
                                    {
                                        for(int m = 0; m < AnzahlKonten; m++)
                                        {
                                            //neu_konto = cde.neu_Kundenkonto(m);
                                            neu_konto.besitzerID = person.KundenID;
                                            neu_konto.KontoNr = Convert.ToInt32(MyInput.ReadLine( ));
                                            neu_konto.SparB = Convert.ToInt32(MyInput.ReadLine( ));
                                            neu_konto.ZinsS = Convert.ToInt32(MyInput.ReadLine( ));
                                            neu_konto.GutH = Convert.ToInt32(MyInput.ReadLine( ));
                                            cde.Add(neu_konto);
                                        }
                                    }
                                    else
                                    {
                                        AnwendungSchliessen( );
                                    }
                                    break;

                                case "S":
                                    
                                    Console.Write(sparKo+"\n\n");
                                    if(AnzahlKonten > 0)
                                    {
                                        for(int j = 0; j < AnzahlKonten; j++)
                                        {
                                            //neu_konto = cde.neu_Kundenkonto(j);
                                            neu_konto.besitzerID = person.KundenID;
                                            neu_konto.KontoNr = Convert.ToInt32(MyInput.ReadLine( ));
                                            neu_konto.SparB = Convert.ToInt32(MyInput.ReadLine( ));
                                            neu_konto.ZinsS = Convert.ToInt32(MyInput.ReadLine( ));
                                            neu_konto.GutH = Convert.ToInt32(MyInput.ReadLine( ));
                                            cde.Add(neu_konto);
                                            cde.TrimToSize( );
                                          
                                        }
                                    }
                                    else
                                    {
                                        AnwendungSchliessen( );

                                    }
                                    break;               

                                default:
                                    //Console.WriteLine("");
                                    break;
                            }
                        }
#if REDIRECT
                        RestoreInput( );
#endif
                    }
                    catch(Exception e)
                    {
                        Console.Write(e.StackTrace);
                    }
            }
        }
        static bool NochEinKontoAnlegen( )
        {
            string janein;
            do
            {
                Console.Write("\n\nNoch eine Konto anlegen? J/N: ");
                janein = MyInput.ReadLine( ).ToUpper( );
            }
            while(janein != "J" && janein != "N");
            return janein == "J";
        }
        //static bool PersonAnlegen( )
        //{
        //    //string name;
        //    //int alter;
        //    string jn = MyInput.ReadLine( ).ToUpper();
                
        //    bool b = jn == "J" || jn == "j";

        //    if(b)
        //    {
                
        //        //Kunde client = new Kunde( );
        //        //client.Name = MyInput.ReadLine( );
        //        //client.Vorname = MyInput.ReadLine( );
        //        //client.Email = MyInput.ReadLine( );
        //    }
        //    return b;
        //}

        static void AnwendungSchliessen( )
        {
            Console.WriteLine("Bitte RETURN drücken, um Anwendung zu beenden"); 
            MyInput.Read( ); 
        }

        static void RedirectInput(string InputFileName)
        {
            MyInput = new StreamReader(InputFileName);
            OriginalStdin = Console.In;
            Console.SetIn(MyInput);
        }
        static void RestoreInput( )
        {
            Console.SetIn(OriginalStdin);
        }
    }
}
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 23.10.08 17:44 
Und was willst Du uns mit diesem Code sagen? Du hast doch offensichtlich Fragen, aber welche?

Du solltest unbedingt ArrayList durch List<T> ersetzen; das wird (wie ich in meinem letzten Beispiel zeigte) eine Reihe von Unklarheiten beseitigen.

Außerdem sind Convert.ToXxxx möglichst zu vermeiden. Unbedingt vorzuziehen sind (je nachdem, was möglich ist): Parse, ParseExact, TryParse, TryParseExact. Convert schmeißt im Fall eines Falles eine Exception; bei den anderen Varianten kannst Du das besser steuern.

Für weitere Erläuterungen gibt es vor allem die SDK-Doku/MSDN. Einführungen findest Du (soweit nötig) z.B. im OpenBook Visual C#

Jürgen

PS. Denk doch mal darüber nach, ob die Überschrift nicht geändert werden sollte, damit sie zu den Fragen besser passt. Dazu kannst Du den ersten Beitrag ändern.

PS 2. Ich halte es für denkbar, dass es jetzt so langsam zu einem neuen Thema überleitet. Dann solltest Du eine neue Diskussion im passenden Unterforum starten.

PS 3. Solche Arbeitsabläufe mit Eingaben und Datenverarbeitung solltest Du besser von vornherein in einer Anwendung mit GUI (WinForms bzw. WPF anstelle von Console) realisieren.
gervacio Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 23.10.08 19:49 
ps3: du hast sicherlich recht, ich hab einfach so vor mich hin was programmiert was mir so in dem Sinn kam deshalb.. Dann Stösst du auf dies und jenes Problem... Macht aber spaß ;-)))


Frage:

Welche Vorteile habe ich durch den List<> im gegensatz zum Arraylist?

In dem programm werden verscheidene datebtypen gespeichert also ist arraylist nicht schlecht oder? Ich bin jedenfalls für neue ideen offen, muss noch so viel dazulernen!!!!

her damit!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 23.10.08 22:51 
Streich ArrayList einfach komplett aus deinem Gedächtnis. Selbst wenn die Einträge deiner Liste keine gemeinsame Basisklasse besitzen (was soll denn außer Kunde-Objekten noch rein?), ist eine List<object> vorzuziehen. Schon allein dafür, dass du dich mit einer Klasse weniger herumschlagen musst.

_________________
>λ=