Autor |
Beitrag |
spitzname
      
Beiträge: 27
|
Verfasst: So 27.06.10 14:00
Hallo, ich möchte zwei Klassen schreiben die daten von Personen verwalten und würde mich über Tipps freuen.
Die Erste klasse heisst Person.
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:
| class Person {
private string nachname; private string vorname; private long ID;
public Person(string name, string v_nahme, long ID) { nachname = name; vorname = v_nahme; this.ID = ID; }
public string Nachname { get { return nachname; } set { this.nachname = value; } }
public string Vorname { get { return vorname; } set { this.vorname = value; } }
public long ID_Nummer { get { return ID; } set { this.ID = value; } } } |
Die Daten einer Person werden in einer Instanz der Klasse person gespeichert.
Für den Zugriff auf die Elementvariablen werden die entsprechenden Accessoren verwendet.
Nun möchte ich Zur Verwaltung von mehreren Personen eine Klasse PersonenGruppe schreiben.
Diese soll eine ArrayList-Instanz mit Elementen vom Typ Person beinhalten.
ab hier komme ich nicht voran und würde mich über jede Hilfe freuen.
C#-Quelltext 1: 2: 3: 4: 5: 6:
| class PersonenGruppe { List<Person> personListe = new List<Person>();
} |
gruß spitzname
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
Zuletzt bearbeitet von spitzname am So 27.06.10 14:05, insgesamt 1-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 27.06.10 14:03
Du müsstest dann aber schon noch schreiben, warum Du nicht weiter kommst 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
spitzname 
      
Beiträge: 27
|
Verfasst: So 27.06.10 14:11
|
|
Toeffi
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 3
|
Verfasst: So 27.06.10 14:38
Genauso wie du es auch mit anderen Properties machst.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| public class PersonenGruppe { public List<Person> Personen{get;private set;}
public PersonGruppe() { this.Personen = new List<Person>(); }
} |
Schon kannst du Personen in deiner Personengruppe verwalten, indem du sie über
C#-Quelltext 1: 2:
| PersonGruppe gruppe = new PersonGruppe(); gruppe.Personen.Add(new Person(...)); |
hinzufügst.
Für diesen Beitrag haben gedankt: spitzname
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 27.06.10 14:46
Für diesen Beitrag haben gedankt: spitzname
|
|
spitzname 
      
Beiträge: 27
|
Verfasst: So 27.06.10 20:25
Danke, für die Antworten die haben mir weitergeholfen!
Ich habe noch folgende Frage zu dem obigen Thema:
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:
| public partial class FrmPersonVerwaltung : Form {
public FrmPersonVerwaltung() { InitializeComponent(); }
private void btnAdd_Click(object sender, EventArgs e) { FrmDaten daten = new FrmDaten();
DialogResult dlgAntwort; Person p = new Person(); PersonGruppe gruppe = new PersonGruppe();
dlgAntwort = daten.ShowDialog();
if (dlgAntwort == DialogResult.OK) { p.Nachname = daten.txtNachname.Text; p.Vorname = daten.txtVorname.Text; p.ID = Convert.ToInt64(daten.ID.Text);
gruppe.Person.Add(new Person(p.Nachname, p.Vorname, p.ID)); txtEingabe.AppendText(gruppe.Person[0] + Environment.NewLine); daten.Close(); } } } |
Mit dem Code füge ich mit einem Click auf OK einem Formular in eine TextBox, die in diesem Fall txtEingabe heisst, Personen daten(p.Nachname, p.Vorname, p.ID) hinzu.
Nun zu meiner Frage: Wie kann man einen bestimmten Datensatz einer Person jetzt löschen?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private void btnClear_Click(object sender, EventArgs e) {
FrmDaten daten = new FrmDaten(); DialogResult dlgAntwort; Person p = new Person(); PersonGruppe gruppe = new PersonGruppe(); dlgAntwort = daten.ShowDialog();
if (dlgAntwort == DialogResult.OK) { ................? } } |
würde mich über Tipps freuen
gruß spitzname
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
Toeffi
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 3
|
Verfasst: So 27.06.10 20:32
Naja erstmal was anderes.
Das hier:
C#-Quelltext 1:
| gruppe.Person.Add(new Person(p.Nachname, p.Vorname, p.ID)); |
brauchst du nicht machen, denn du hast doch vorher schon ein Person objekt erstellt, welchem du die ganzen sachen zugewiesen hast.
Da reicht es wenn du
C#-Quelltext
machst.
Zum löschen Thema könntest du mit Extension Methods arbeiten und wie folgt löschen.
C#-Quelltext 1: 2: 3:
| Person p = gruppe.Person.Where(person => person.ID == 100).SingleOrDefault(); if(p != null) gruppe.Person.Remove(p); |
Die 100 als ID ist jetzt ersponnen die musst du natürlich aus deinem Forumlar irgendwie ziehen.Da wo du das eben speicherst oder so.
Für diesen Beitrag haben gedankt: spitzname
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: So 27.06.10 21:54
Hallo,
also das was Toeffi so schreibt finde ich sehr umständlich. Schau dir den Ansatz von Sebastian (jaenicke) an... Mit einer Collection und direkten Zugriff per Index macht das mehr Sinn.
Allerdings macht der Accessor/Index über die pure Liste meines erachtens weniger Sinn, sondern an der Stelle sollte man die Id verwenden.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| public Person this[int index] { get { return personListe.Where(person => person.Id == index).First(); } set { try { this.Remove(this[index]); this.Add(value); catch { } } |
In deiner Form Klasse brauchst du dann eine Klassenmember vom Typ PersonenGruppe... Ansonsten sind die hinzugefügten Personen wieder weg(wenn du eine neue Instanz anlegst).
Löschen würde dann so aussehn (wenn du die ID hast):
C#-Quelltext 1:
| personenGruppe.Remove(personenGruppe[100]); |
bzw. wenn du gleich das Objekt hast (was wahrscheinlicher ist):
C#-Quelltext 1:
| personenGruppe.Remove(person); |
Das sieht doch logischer aus ?
Gruß
Für diesen Beitrag haben gedankt: spitzname
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 27.06.10 22:09
Indexer, Lambdas, leere Catch-Blöcke (  )... ich weiß nicht, ob das hier so wirklich angemessen ist. Wie wäre es mit folgendem Code für den Anfang?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| class PersonenGruppe { ...
public Person FindPersonByID(int id) { foreach (Person p in ...) if (p...) ... }
public void RemovePersonByID(int id) { Personen.Remove(FindPersonByID(id)); } } |
Bitte entsprechend ergänzen  .
Und nichtsdestotrotz hat Daniel mit
danielf hat folgendes geschrieben : | In deiner Form Klasse brauchst du dann eine Klassenmember vom Typ PersonenGruppe... Ansonsten sind die hinzugefügten Personen wieder weg(wenn du eine neue Instanz anlegst). |
natürlich vollkommen recht  .
_________________ >λ=
Für diesen Beitrag haben gedankt: spitzname
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: So 27.06.10 22:15
Ich denke Indexer sind schon angebracht genau so wie Linq Ausdrücke.
Aus dem leeren Catch Block kann man natürlich auch davor abfragen, ob die gewünschte Id schon besteht... Performanter wäre aber der try catch  Ach seh grad.. das Add natürlich dahinter... Fußball war lang heute Mittag
Aber darüber soll er glaub selbst entscheiden
Angenehmer fürs erste ist sicherlich eine foreach-Schleife ... dennoch würde ich den Index als "Pflicht" sehen.. ansonsten ist der Code "verwirrend".
Gruß
Für diesen Beitrag haben gedankt: spitzname
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 27.06.10 22:36
Für diesen Beitrag haben gedankt: spitzname
|
|
Toeffi
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 3
|
Verfasst: Mo 28.06.10 07:24
Ok da habt ihr natürlich recht, da habe ich wohl mit Kanonen auf Spatzen geschossen und ganz vergessen das er gerade mit OOP anfängt. Die Idee mit dem Indexer ist wirklich gut. Gut dann kann sich der Threadersteller die Lösung ja mal anschauen wenn er weiter ist  Danke für die Ergänzungen.
Für diesen Beitrag haben gedankt: spitzname
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mo 28.06.10 09:07
Also ich bin im getter-Teil dafür, dass eine Exception geschmissen wird. Sonst muss man ja später in jedem Code Abschnitt überprüfen ob die Person wirklich existiert. Ich gehe ja davon aus, dass wenn ich eine ID habe diese Person tatsälich exitisert.
Den Set-Teil würde ich ganz weg lassen, dafür gibt es ja Add.
Ach da fällt mir auf, dass ich von einer anderen Definitino der PersonenGruppe-Klasse ausgegangen bin (und keiner hat gemeckert  ).
Ich würde die PersonenGruppe von einer generischen Liste der Klasse Person erben lassen, um auf sämtliche Methoden der Collection direkt zugreifen zu können (vgl. mein Code). Dann sind später auch andere Abfragemöglichkeiten drin ohne jedes mal eine eigne Methode anzulegen.
Also nochmal zusammenfassend:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| publc class PersonenGruppe : List<Person>
public Person this[int] { get { return personListe.Where(person => person.Id == index).First(); } } } |
Die Verwendung der Klasse würde dann so aussehen:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| PersonenGruppe gruppe = new PersonenGruppe(); gruppe.Add(new Person { Name = "Mustermann", Vorname = "Max" }); gruppe.Add(new Person { Name = "Mustermann", Vorname = "Moritz" }); Person eva = new Person { Name = "Musterfrau", Vorname = "Eva" }; gruppe.Add(eva);
int id = 5; gruppe.Remove(gruppe[id]);
gruppe.Remove(eva); |
Hoffe das veranschaulicht nochamls was ich gemeint hab.
Gruß
Für diesen Beitrag haben gedankt: spitzname
|
|
spitzname 
      
Beiträge: 27
|
Verfasst: Mo 28.06.10 14:08
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mo 28.06.10 14:21
zu 2) das ist so korrekt. Nun musst du aber noch auf den speicher zugreifen, anstatt wieder (zeile 19.) eine neue Gruppe zu erstellen. Das kannst du austauschen indem du die Zeile löscht und sie anstat speicher gruppe benennst. Die Instanziierung kannst du gleich in Zeile 4 machen ( private PersonenGruppe speicher = new Personengruppe(););
zu 1) wenn du die Fehlermeldung mitliefster wäre es für uns einfacher  Aber ich denke der Fehler liegt daran, dass du in der Methode FindPersonByID unter umständen (wenn nicht existiert) keine Person zurück gibst. Du kannst nun entweder return null; in Zeile 19 zurückgeben oder in Zeile 19. eine ArgumentException werfen (Siehe Diskussion kha und mir).
Gruß
Für diesen Beitrag haben gedankt: spitzname
|
|
spitzname 
      
Beiträge: 27
|
Verfasst: Mo 28.06.10 15:44
|
|
spitzname 
      
Beiträge: 27
|
Verfasst: Fr 02.07.10 13:08
Hallo nochmal,
ich habe zu diesem Thema noch eine folgende Frage:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| private void btnLoad_Click(object sender, EventArgs e) { DialogResult dlgAntwort; dlgAntwort = dlgLoad.ShowDialog();
if (dlgAntwort == DialogResult.Cancel) return; try { StreamReader src = new StreamReader(dlgLoad.FileName);
txtEingabe.Text = src.ReadToEnd(); src.Close(); } catch (Exception ex) { Console.WriteLine("Fehler 1 " + ex.Message); } } |
mit diser Funktion kann man eine Textdatei in die Textbox("txtEingabe") aufnehmen. Die Textbox("txtEingabe") und die Textdatei hat fogenden Aufbau:
-->Beispiel:
Zeile-------- Dateiinhalt------------logische Bedeutung
1-------------Petersen---------------Nachname
2-------------Peter------------------Vorname
3-------------1234-------------------ID
4------------------------------------Leerzeile
5-------------Martinsen--------------Nachname
6-------------Martin-----------------Vorname
7-------------4321-------------------ID
8------------------------------------Leerzeile
wie kann man aus dieser Textdatei die z.B. diese obengenannten Daten enthält jede einzelne Person in die PersonenGruppe (ArrayList) aufnehmen.
würde mich über Tipps freuen
gruß
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Fr 02.07.10 13:33
Das Thema hat nichts mehr mit dem Urspürnglichen Problem zu tun, wobei der Thread-Titel auch alles Möglich zu läßt. Mach also nächstes mal ein neues Thema auf für eine andere Frage und wähle den Titel passend zum Problem.
Du musst die Informationen aus der Datei herausparsen und dann ein neues Personen-Objekt erstellen. Für string-Verarbeitung gibt es sehr viele Methoden (siehe Klasse string). Dazu kommen Reguläre Ausdrücke. Was du genau nimmst ist abhängig davon, wie die Daten aufgebaut sind und wie du dich auskennst.
Du hast den Aufbau, zumindest für mich, nicht genau beschrieben. Sind das wirklich Striche oder repräsentieren diese Leerzeichen? Ist die Zeilennummber bzw. die logische Bedeutung immer dabei?
Am besten du gehst Zeilenweise durch die DAtei:
Mit der statischen methode ReadAllLines der Klasse File bekommst du den Inhalt einer Datei zeilenweise: File.ReadAllLines("file")
Je nach "Trennlogik" musst du dann die entsprechenden Zeilen zerlegen.
Gruß
|
|
spitzname 
      
Beiträge: 27
|
Verfasst: Fr 02.07.10 14:57
Danke für die Antwort, dann werde ich am besten ein neues Thema starten um weitere Fragen stellen zukönnen.
|
|