Benutzer mit den meisten Antworten
Editieren eines Elements in einer Collection

Frage
-
Hallo,
ich habe eine Liste von Objekten und möchte ein Element aus der Liste editieren. Für besseres Verständnis habe ich die (nicht sehr sinvolle) Klasse Person erstellt und will in der Editfunktion den Nachnamen ändern. Wie muss ich die Editierfunktion aufbauen?public class person { string Vorname = string.Empty; string Nachname = string.Empty; List<person> listPersonen = new List<person>(); public person() { } public person(string vorname, string nachname) { Vorname = vorname; Nachname = nachname; } /// <summary> /// Hinzufügen einer Person /// </summary> /// <param name="vorname"></param> /// <param name="nachname"></param> public void Add(string vorname, string nachname) { listPersonen.Add(new person(vorname, nachname)); } /// <summary> /// Finden einer Person /// </summary> /// <param name="vorname"></param> /// <returns></returns> public person Find(string vorname) { return listPersonen.Find(delegate(person p2) { return p2.Vorname == vorname; }); } /// <summary> /// Editieren einer Person in der Liste /// Nachname wird gesucht /// Vorname wird geändert /// </summary> /// <param name="vorname"></param> /// <param name="nachname"></param> public void Edit(string vorname, string nachname) { } }
Vielen Dank für Eure Tipps
Andreas
- Bearbeitet AndreasM85 Dienstag, 25. Februar 2014 19:11
Antworten
-
Hallo,
du solltest deine Klasse besser in 2 zerlegen. Eine Klasse enthält die Daten zu einer Person und die andere Klasse eine Liste von Personen. Hier mal in Kurzform:public class Person{ public Person(string vorname, string nachname){ this.Vorname=vorname; this.Nachname=nachname; } public string Vorname{get;set;} public string Nachname{get;set;} } public class Personen{
public void Add(string vorname, string nachname){
this.personen.Add(new Person(vorname, nachname));//Person hinzufügen
} List<Person> personen = new List<Person>(); }In Personen kannst du nun mit Hilfe von LINQ deine Personen suchen:
public IEnumerable<Person> FindPersonen(string vorname, string nachname){ return this.personen.Where(x=> x.Vorname == vorname || x.Nachname == nachname); }
Mit Where wird jedes Element ausgewählt, welches in der Bedingung true ergibt. Der Lambdaausdruck überprüft, ob der Vorname oder der Nachname übereinstimmt. Zurück gegeben wird eine Unspezifische Liste von Person-Objekten. Diese kannst du mit ToList() in eine List<T> und mit ToArray() in ein Array umwandeln.
Wenn du nun die FindPersonen-Methode aufrufst, kannst du zunächst mit FirstOrDefault prüfen ob ein Element enthalten ist und wenn ja, wird dir das Erste zurück gegeben:
var list = FindPersonen("Max", "");//Nur anch dem Vornamen suchen var item = list.FirstOrDefault();//Erstes Element abfragen if(item != null)//Elemente enthalten? { //Zuweisen der neuen Daten: item.Nachname = "Mustermann"; }
Da es sich bei Person um eine Klasse handelt, werden Änderungen an item automatisch auch in der Liste vorgenommen. (Weil item nur eine Referenz auf das Element in der Liste ist.)
Ob du den Code zum Ändern des Nachnamens nun direkt in die Personen-Klasse packt oder es dem Verwender der Klasse überlässt ist natürlich deine Entscheidung. Wenn du allerdings eine Methode dafür in Personen erstellst, empfehle ich dir diese EditVorname o.ä. zu nennen, denn Edit ohne alles ist nicht sehr eindeutig.
Noch 2 kleine off-Topic Dinge zu deinem Code:
- Du solltest dich zwischen Deutsch und Englisch entscheiden. Momentan ist das ein nicht immer leicht nachvollziehbares Bennenungschaos.
- Was die einzelnen Parameter einer Methode machen, solltest du in der Doku zwischen die param-Tags schreiben. Einen Zeilenumbruch kannst du mit para erzeugen.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert AndreasM85 Donnerstag, 27. Februar 2014 19:29
Alle Antworten
-
Hallo,
du solltest deine Klasse besser in 2 zerlegen. Eine Klasse enthält die Daten zu einer Person und die andere Klasse eine Liste von Personen. Hier mal in Kurzform:public class Person{ public Person(string vorname, string nachname){ this.Vorname=vorname; this.Nachname=nachname; } public string Vorname{get;set;} public string Nachname{get;set;} } public class Personen{
public void Add(string vorname, string nachname){
this.personen.Add(new Person(vorname, nachname));//Person hinzufügen
} List<Person> personen = new List<Person>(); }In Personen kannst du nun mit Hilfe von LINQ deine Personen suchen:
public IEnumerable<Person> FindPersonen(string vorname, string nachname){ return this.personen.Where(x=> x.Vorname == vorname || x.Nachname == nachname); }
Mit Where wird jedes Element ausgewählt, welches in der Bedingung true ergibt. Der Lambdaausdruck überprüft, ob der Vorname oder der Nachname übereinstimmt. Zurück gegeben wird eine Unspezifische Liste von Person-Objekten. Diese kannst du mit ToList() in eine List<T> und mit ToArray() in ein Array umwandeln.
Wenn du nun die FindPersonen-Methode aufrufst, kannst du zunächst mit FirstOrDefault prüfen ob ein Element enthalten ist und wenn ja, wird dir das Erste zurück gegeben:
var list = FindPersonen("Max", "");//Nur anch dem Vornamen suchen var item = list.FirstOrDefault();//Erstes Element abfragen if(item != null)//Elemente enthalten? { //Zuweisen der neuen Daten: item.Nachname = "Mustermann"; }
Da es sich bei Person um eine Klasse handelt, werden Änderungen an item automatisch auch in der Liste vorgenommen. (Weil item nur eine Referenz auf das Element in der Liste ist.)
Ob du den Code zum Ändern des Nachnamens nun direkt in die Personen-Klasse packt oder es dem Verwender der Klasse überlässt ist natürlich deine Entscheidung. Wenn du allerdings eine Methode dafür in Personen erstellst, empfehle ich dir diese EditVorname o.ä. zu nennen, denn Edit ohne alles ist nicht sehr eindeutig.
Noch 2 kleine off-Topic Dinge zu deinem Code:
- Du solltest dich zwischen Deutsch und Englisch entscheiden. Momentan ist das ein nicht immer leicht nachvollziehbares Bennenungschaos.
- Was die einzelnen Parameter einer Methode machen, solltest du in der Doku zwischen die param-Tags schreiben. Einen Zeilenumbruch kannst du mit para erzeugen.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert AndreasM85 Donnerstag, 27. Februar 2014 19:29
-
Hi,
also erstmal vorweg, ich kann Koopakiller nur zu stimmen mit der Namensgebung....
Um deine Frage zu beantworten: du suchst dir das Element heraus und weisst dem einfach einen Wert zu.
Minimalbeispiel:
public class Person { public Person(string Vorname, string Nachname) { this.Vorname=Vorname; this.Nachname=Nachname; } public string Vorname { get; set; } public string Nachname { get; set;} } static void Main(void) { List<Person> Personen=new List<Person>(); Personen.Add(new Person("Fridolin","Fröhlich")); Personen.Add(new Person("Heinrich","Heidenreich")); Personen[1].Vorname="Max";
Personen[1].Nachname="Mustermann"; }
Hier mache ich aus aus Heinrich Heidenreich einen Max Mustermann...
Der Clou dabei ist das in der Liste nur die Referenzen auf die Objekte gespeichert sind und du mit dem Elementzugriff auf ein Listenelement, kein neues Objekt erzeugst sondern nur die Daten, welche die Referenz gespeichert hat.
Das suchen der Liste kann vielfältig sein. Am besten eignet sich Linq dafür aber da will ich kein neues Fass aufmachen. Falls es dich doch interessiert einfach nachfragen.