private static List<Auto> _autos = new List<Auto>();
private static List<Personen> _personen = new List<Personen>();
und da drin kann ich jeweils die Namen der Autos und Personen eingeben. Bsp.: ich klicke 1 und dann kann ich selber eingeben: VW, Golf, schwarz.
Das gleiche bei Personen: Lena, Bauer, 13.05.1996
ich kann eben unterschiedlich viele Elemente eingeben und diese werden dann in die Listen gespeichert.
So, jetzt möchte ich, dass wenn ich 5 eingebe sollen alle bereits vorhandenen Personen auftauchen und ich kann davon eine auswählen und diese dann löschen.. so Problem für mich ist, wie mach ich des dass ich da eine Person auswählen kann, ich weiß ja vorher nicht welche ich auswähle.
also mein Programm beginnt so:
Console.WriteLine(
"Wähle bitte eine Möglichkeit: \n\n" +
"1 für das Anlegen eines neuen Autos \n" +
"2 für das Anzeigen der vorhandenen Autos \n" +
"3 für das Anlegen von Personen \n" +
"4 für das Anzeigen einer vorhandenen Person \n\n" +
"5 für das Löschen einer Person \n" +
"6 für das Löschen eines Autos \n" +
"7 für das Bearbeiten einer Person \n" +
"8 für das Bearbeiten eines Autos \n");
ich habe die ersten 4 Punkte bereits, aber verstehe nicht ganz wie ich da jetzt bestimmte Elemente löschen/bearbeiten kann.
du kannst Items in einer Liste mit ihrem Index adressieren.
Wenn jemand bei dir beispielsweise "5" eingibt, führst du alle vorhandenen Personen auf, und der Benutzer kann dann wieder via Eingabe einer Zahl auswählen, welche Person gelöscht werden soll.
Hey, hab es jetzt geschafft bestimmte Elemente in einer Liste zu löschen, aber wie kann ich denn bestimmte Elemente bearbeiten? Heißt ich will z.B,. den Namen oder Geburtstag verändern, während der Konsolen Anwendung, muss ich dafür wieder eine neue Liste anlegen? 8o
beschäftige dich doch mal ein paar Minuten mit Listen. Mach dir mal klar, was dort passiert. Du hältst dir eine Liste mit Objekten. Diese kannst du via eines Index adressieren. Somit bekommst du das Element an der Stelle n mit dem index n-1, da 0 basiert.
Das Element kannst du dann nehmen und die Properties verändern. Schau dir auch mal Referenz- und Wertetypen an.
List<Car> cars = new List<Car>();
for (int i = 0; i < 5; i++)
{
cars.Add(new Car(i, "Porsche 911"));
}
Console.WriteLine(cars[3].Name); // prints "Porsche 911"
cars[3].Name = "Porsche 964";
Console.WriteLine(cars[3].Name); // prints "Porsche 964"
public static void BearbeitePerson()
{
Console.WriteLine("Wähle eine Person, die du bearbeiten willst:");
Console.WriteLine("\n");
for (int i = 0; i < _personen.Count; i++)
{
Console.WriteLine(i.ToString() + " " + _personen[i].ToString());
}
string zuBearbeiten = Console.ReadLine();
Ist es dann richtig wenn ich so anfange, dass er mir praktisch alle vorhandenen Personen in einer nummerierten Liste ausgibt? Und jetzt müsste ich eine auswählen (je nachdem wie viele ich hab), dass ich bearbeiten kann..
Weil ich habe ja keine Autos gegeben, sondern gebe die ja erst in die Konsole ein, verstehst du was ich meine? (sorry, ich bekomm es nicht hin dass ich den C# Code hervor hebe X()
ich weiss zwar nicht wann du wo welche Autos/Personen hast, aber das ändert ja nix am Prinzip :) Du liest die Nummer, die der User bearbeiten will, (string von der Console in Nummer parsen) du holst dir das passende Item (machst natürlich Prüfungen ob das alles passt und gibst entsprechende Fehlermeldungen aus) und wenn alles passt bearbeitest du das Item nach deinen Wünschen.
Hey, ja ich frage zu erst ab "Vorname?" dann "Nachname?" dann "Geburtstag?" und des was ich da eingebe wird gespeichert. Sobald ich die Nummer 7 drücke, erscheint eine Liste mit allen Personen die ich manuell eingegeben habe. Und von dieser Liste will ich eine beliebige auswählen die ich ändern kann.
Kann ich dann anstatt wie du "Porsche" zu schreiben, einfach einen Platzhalter machen? Weil er soll ja dafür kein vorgegebenes Wort einsetzen, sondern ich will ja dann wieder die Person/auto manuell bearbeiten.
ich denke es ging darum, die Person herauszufinden und das Objekt zu holen, was du bearbeiten willst. Somit löse doch erstmal das Problem.
Du hast eine Liste mit 10 Leuten. Du fragst ja auch schon, welche Person der User bearbeiten will. Du liest sogar schon das Ergebnis ein. Alles, was du tun musst, ist den string in eine Nummer wandeln und dir den entsprechenden Eintrag aus der Liste holen.
Das Ersetzen ist dann der zweite Schritt. Eventuell kannst du dann fragen "Wie soll der neue Vorname sein?" und dann liest du wieder von der Console und bearbeitest das Property deiner Person. Eine mögliche Lösung habe ich dir mit Autos oben schon vorprogrammiert.
Mein Programm läuft so natürlich nicht, denn die Klasse "Car" braucht ja einen Konstruktor der eben zwei Argumente nimmt. Die Klasse habe ich nicht gepostet, weil ichs hier im Editor geschrieben habe. Das war ja nur zum Demonstrieren, wie du ein Item adressierst. Das kann bei dir komplett anders aussehen.
Ich glaube hier geht es um Grundlagen wie Datentypen und Klassen statt um das Problem, wie man Items aus einer Liste holt.
PS: Jetzt poste ich dir ein Bild, wie du deinen Code markieren kannst und du verwendest weder den Code-Tag noch den Error-Tag. Wieso beachtest du die Hinweise nicht?
Coffeebean hat das schon gut erklärt.
Eins vorweg, deine Klasse Personen ist falsch benannt, da diese immer nur eine Person als Objekt enthält. besser wäre Person als Einzahl. In der Liste sind dann mehrere Personen somit kann der Name dort bleiben:
List<Person> _personen
Du musst dir vorstellen deine Liste ist im Hintergrund eine Tabelle.
index|Objekt mit Persoenen (List<Personen> _personen)
0|_personen.Vorame="Thomas",_personen.Nachname="Müller"
1|_personen.Vorame="Maike",_personen.Nachname="Pocher"
2|_personen.Vorame="Markus",_personen.Nachname="Meyer"
....usw
Und dann kannst du dir Sachen aus der Tabelle holen:
Personen myPerson = _personen[1];
enstpricht dann Objekt Personen (_personen.Vorame="Maike",_personen.Nachname="Pocher")
string myPersonName = myPerson.Vorname;
entspricht dann string aus dem Objekt myPerson (Maike)
Das solltet ihr aber eigentlich auch gezeigt bekommen haben wenn ihr am C# lernen seid.
Gruß Thomas
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von 123thomas am .
Vielleicht hilft's dir, wenn du einmal einen Blick in den Anhang wirfst.
Ansonsten beachte bitte unbedingt [Hinweis] Wie poste ich richtig?, Punkt 1.1: du musst dich schon selbst in die Grundlagen einlesen. Wir können dir Dinge erklären, aber wir können sie nicht für dich verstehen.
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
ja wie gesagt, bin noch total am Anfang und finde das alles sehr schwierig noch
Hey 123thomas,
danke für deine Hilfe! mein Code macht aber einfach gar nichts, ich gebe die Person ein die er ändern soll aber nichts passiert 8o
public static void BearbeitePerson()
{
Console.WriteLine("Wähle eine Person, die du bearbeiten willst:");
Console.WriteLine("\n");
for (int i = 0; i < _personen.Count; i++)
{
Console.WriteLine(i.ToString() + " " + _personen[i].ToString());
}
Personen myPerson = _personen[1];
string myPersonName = myPerson.Vorname;
Console.ReadLine();
}
Ich kenne ja die einfachen Grundlagen, aber ich verstehe einfach nicht, warum das Programm einfach nichts macht? nicht mal mit return passiert etwas..
Personen myPerson = _personen[1];
string myPersonName = myPerson.Vorname;
Du holst dir die Person, die an index 1 steht und speicherst den Vornamen in einer Variable. Das wars. Du gibst die Variable nicht aus, du veränderst sie nicht...du machst gar nichts. Dann passiert auch nix :)
public static void BearbeitePerson()
{
Console.WriteLine("Wähle eine Person, die du bearbeiten willst:");
Console.WriteLine("\n");
for (int i = 0; i < _personen.Count; i++)
{
Console.WriteLine(i.ToString() + " " + _personen[i].ToString());
}
//Benutzer muss den zu bearbeitenden Index eingeben
int index = Convert.toInt32(Console.Readline()); //hier kann das Programm abstürzen, wenn z.B. ein Buschstaben eingegeben wird. Hier müssten Fehler bei der Eingabe abgefangen werden, aber das ist ein komplexeres Thema
//Person(Objekt) das zu bearbeiten ist holen
Personen myPerson = _personen[index];
//neuen Namen einlesen
string neuerName = Console.ReadLine();
//neuen Namen der myPerson zuweisen
//myPerson in der Liste _personen an der Stelle index zurückschreiben
Console.ReadLine();
}
Die beiden letzten Zeilen habe ich bewusst frei gelassen, durch die Kommentare müsstest du eigentlich erkennen was dort gemacht werden muss.
wenn der TE den eingegebenen Namen der Person "myPerson" zuweist, braucht sie es nicht in die Liste zurückschreiben. Es ist ja das gleiche Objekt, was in der Liste hängt.
das sind mMn die ersten Grundlagen zu verstehen, dass es sich dabei um das gleiche Objekt handelt. (Referenz- und Wertetyp) Aber ich verstehe deinen Punkt. Lass uns das hier nicht weiter besprechen. Danke. Thread ist schon gross genug. :)
public static void BearbeitePerson()
{
Console.WriteLine("Wähle eine Person, die du bearbeiten willst:");
Console.WriteLine("\n");
for (int i = 0; i < _personen.Count; i++)
{
Console.WriteLine(i.ToString() + " " + _personen[i].ToString());
}
int index = Convert.ToInt32(Console.ReadLine());
Personen myPerson = _personen[index];
Console.Write("Vorname: ");
var vorname = Console.ReadLine();
if (string.IsNullOrEmpty(vorname)) return;
und dann das halt für Nachname und Gb erweitern, ich habe nämlich vorhin einen anderen und übersichtlicheren Weg gefunden.. ich bin in die Klasse Personen gegangen und hab dort:
public string ReadNewValue(string prefix)
{
Console.Write(prefix + ": ");
var input = Console.ReadLine();
return input;
geschrieben. In meinen Main Code musste dann nur noch:
public static void BearbeitePerson()
{
Console.WriteLine("Wähle eine Person, die du bearbeiten willst:");
Console.WriteLine("\n");
for (int i = 0; i < _personen.Count; i++)
{
Console.WriteLine(i.ToString() + " " + _personen[i].ToString());
}
int index = Convert.ToInt32(Console.ReadLine());
Personen myPerson = _personen[index];
myPerson.Vorname = myPerson.ReadNewValue("Vorname");
myPerson.Nachname = myPerson.ReadNewValue("Nachname");
myPerson.Geburtstag = myPerson.ReadNewValue("Geburtstag");
}
Jetzt musst du dir natürlich noch die Frage stellen lassen, wozu ein Objekt "Person" mit Nachname, Vorname und Geburtstag zusätzlich noch wissen muss, was eine Console ist. Die meisten Personen würden abstreiten, dass erst dieses Wissen einen zu einer Person macht ;).
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Du willst nun deinen Personen-Klasse in was größeres integrieren. Also machst du eine neue WinForms-Anwendung und willst dort deine Objekte weiter benutzen. Was ja auch völlig okay ist.
Doch plötzlich: In WinForms gibt es keine Console...