Laden...

Bestimmte Elemente in einer Liste List<T> ändern/löschen?

Erstellt von Lens445 vor 6 Jahren Letzter Beitrag vor 6 Jahren 14.703 Views
L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren
Bestimmte Elemente in einer Liste List<T> ändern/löschen?

Hey, ich habe folgende Listen erstellt:

         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.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Lens445,

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.

Dafür gibts dann

List<T>.Remove Method (T) oder List<T>.RemoveAt Method (Int32)

Gruss

Coffeebean

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

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

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Lens445,

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"

Deine Frage hättest du aber ganz einfach ausprobieren können, wenn du den [Artikel] Debugger: Wie verwende ich den von Visual Studio? verwendet hättest. Dann siehst dus ja. Der Lerneffekt ist einfach grösser dann.

Gruss

Coffeebean

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren
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()

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Lens445,

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.

Code hervorheben: Siehe Bild im Anhang

Gruss

Coffeebean

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

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.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Lens445,

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.

Gruss

Coffeebean

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Okay, ich muss also meine Liste

 private static List<Personen> _personen = new List<Personen>();

also _personen zu einen Int wandeln?

nur weiß ich dafür keinen passenden Befehl.. mit _personen.ConvertAll?

und: wenn ich dein Programm teste gibt es mir eine Fehlermeldung aus bei

cars.Add(new Car(i, "Porsche 911"));

Fehlermeldung:
--> Error CS1729 'Personen' does not contain a constructor that takes 2 arguments, wenn ich den Inhalt lösche, dann kommt kein Fehler mehr.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Lens445

_personen zu einen Int wandeln?

Nein.

Wenn du ein Item aus einer Liste holen willst, brauchst du einen index. Dieser Index ist ein int, eine Zahl.

var myPerson = _personen[index];

dieser Index soll ja von dem User gegeben werden können. Du selbst hast ja schon gepostet:

string zuBearbeiten = Console.ReadLine();

"zuBearbeiten" ist jetzt ein string. Du brauchst aber einen int.

Das solltest du umwandeln, damit du dir die Person holen kannst. Beispielsweise mit Int32.TryParse-Methode: (String, Int32)

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.

Hast du dir mal [FAQ] Wie finde ich den Einstieg in C#? angeschaut?

Gruss

Coffeebean

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?

1
124 Beiträge seit 2012
vor 6 Jahren

Hallo,

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

3.003 Beiträge seit 2006
vor 6 Jahren

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.

LaTino

"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)

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

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..

P.S. sorry, hab es vorhin noch nicht hinbekommen

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Lens445,

was erwartest du, was hier passiert?

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 😃

Gruss

Coffeebean

1
124 Beiträge seit 2012
vor 6 Jahren

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.

Gruß

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo 123thomas,

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.

Gruss

Coffeebean

O
79 Beiträge seit 2011
vor 6 Jahren

Das ist wohl richtig. Aber wir haben es hier mit einem ultrablutigen Anfänger zu tun.

Da ist es besser für das Verstehen, wenn man sowas Schritt für Schritt und auch etwas umständlicher formuliert. Die Effizienz kommt dann später 😉

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo OlafSt,

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. 😃

Gruss

Coffeebean

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren

Ich hab es jetzt übrigens geschafft 🙂
Vielen Dank für eure Hilfe!

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Lens445,

das ist gut. Kannst du noch den Code posten, wie dus gemacht hast? Falls der nächste Hilfesuchende das gleiche Problem hat.

Gruss

Coffeebean

L
Lens445 Themenstarter:in
45 Beiträge seit 2017
vor 6 Jahren
      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");

        }

so fand ich es fast einfacher.. 🙂

3.003 Beiträge seit 2006
vor 6 Jahren

Autsch.

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 😉.

Single Reponsibility Principle

LaTino

"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)

16.806 Beiträge seit 2008
vor 6 Jahren

Statische Methoden sollte man sich gar nicht erst angewöhnen.
Bei unsachgemäßer Benutzung führt das direkt in die Hölle - wie hier.

O
79 Beiträge seit 2011
vor 6 Jahren

Wir können die Frage auch anders formulieren:

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...