Entwickler-Ecke
Basistechnologien - Mehrdimensionales Array
gervacio - Mi 22.10.08 13:42
Titel: Mehrdimensionales Array
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?
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
Christian S.: C#-Tags hinzugefügtModeriert von
Christian S.: Topic aus C# - Die Sprache verschoben am Mi 22.10.2008 um 13:47
JüTho - 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 - Do 23.10.08 15:52
hi Jütho, hab ne Arraylist benützt und es funzt hervoragend! Danke dir dennoch!
Christian S. - Do 23.10.08 15:59
gervacio hat folgendes geschrieben : |
| 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.
JüTho - 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:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| ArrayList list = new ArrayList(); list.Add(new Person(...)); list.Add("JüTho"); list.Add(17); Person person0 = list[0] as person; Person person1 = list[0]; Person person2 = list[2] as person; MessageBox.Show(person2.Name); |
Sicheres Arbeiten geht mit List<T>:
C#-Quelltext
1: 2: 3: 4: 5:
| List<Person> list = new List<Person>(); list.Add(new Person(...)); list.Add("JüTho"); Person person1 = list[0]; |
Gruß Jürgen
gervacio - Do 23.10.08 17:08
So sieht mein Code erstmal 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: 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";
#if REDIRECT RedirectInput("input.txt"); #endif
int Anzahl_Kunden = Convert.ToInt32(MyInput.ReadLine()); Kunde person = new Kunde( ); ArrayList abc = new ArrayList( );
KundenKonto neu_konto = new KundenKonto( ); ArrayList cde = new ArrayList();
for(int i = 0; i < Anzahl_Kunden; 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( ); switch(KontoAuswahl) { case "G": Console.Write(giroKo + "\n\n"); if(AnzahlKonten > 0) { for(int m = 0; m < AnzahlKonten; 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.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: 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 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 - 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# [
http://openbook.galileocomputing.de/visual_csharp/]
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 - 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 - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!