Entwickler-Ecke
Basistechnologien - List Erklärung für Dummies :D
GURKE deluxe - Mo 24.01.11 22:04
Titel: List Erklärung für Dummies :D
Hallo,
Vorab: Ich habe noch nie mit Listen (bei C#) gearbeitet!
Ich habe eine Liste mit Strings. Jedem dieser Strings möchte ich weitere Strings zuordnen.
Beispiel:
Person(string)-Hobbys(string)
A(Person)-AB(Hobby)-AC(Hobby)-AD(Hobby)
B-AB-AD-AE-EGF-AS
C-AC
D-WAs-DA
.
.
.
(Die Buchstaben sind frei gewählt und haben nichts zu bedeuten.)
Zum Erstellen der Listen habe ich folgenden Code:
C#-Quelltext
1:
| List<List<string>> PersonHobby= new List<List<string>>(); |
Nun möchte ich diese Liste natürlich befüllen.
Dazu lade ich eine Datei und "splitte" sie in die unterschiedlichen Personen auf. Jeder Personen-String besteht aus dem Namen der Person, einem Trennzeichen (#), seinem Hobby und hat dann noch weitere Hobbys mit Trennzeichen. Nun möchte ich das, die Hobbys in der Liste der Personen gespeichert werden, sodass ich später die Person aufrufen kann und in der Liste zu der Person sehe welche Hobby er besitzt.
Dazu habe ich folgenden Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| string[] Personen = Datei[2].Split(':'); for (int i = 0; i < Personen.Count(); i++) { string[] PH = Personen[i].Split('#'); PersonHobby.Add(PH[0]); for (int j = 1; j < LF.Count(); j++) } |
Wie befülle ich jetzt also diese Doppelte Liste?
Gruß
Julian
Christian S. - Mo 24.01.11 22:23
Hallo!
Ich würde eine Klasse "Person" vorschlagen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| public class Person { public string Name {get; set;}
private List<string> _Hobbies = new List<string>(); public List<string> Hobbies {get { return _Hobbies; }}
public static Person ParseLine(string line) { string parts = line.Split('#'); if (parts.Length == 0) return null;
var result = new Person(); result.Name = parts[0]; for (int j = 1; j < parts.Length; j++) result.Hobbies.Add(parts[j]); return result; } } |
Dann hätetst Du nur noch eine
List<Person> zu füllen, indem Du Deine Datei einliest wie bisher und in der ersten Schleife für jede Zeile
Person.ParseLine(Personen[i]) aufrufst.
Grüße
Christian
//edit: Code nicht getestet
GURKE deluxe - Di 25.01.11 01:26
Hallo Christian,
Erstmal danke für deine schnelle Antwort!
Christian S. hat folgendes geschrieben : |
Dann hätetst Du nur noch eine List<Person> zu füllen, indem Du Deine Datei einliest wie bisher und in der ersten Schleife für jede Zeile Person.ParseLine(Personen[i]) aufrufst.
Grüße
Christian
//edit: Code nicht getestet |
Habs getestet, funktioniert super! (Es fehlte nur [] nach string[] parts) Speichert der locker ab. Eine Frage habe ich jetzt aber dennoch. Wie komme ich wieder an die Daten? Also wie kann ich z.B. mit einer Schleife eine Person raussuchen und deren Hobbys auslesen?
Gruß
Julian
IsNull - Di 25.01.11 10:32
so z.B:
1. Möglichkeit mit foreach, 2te möglichkeit LINQ
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:
| public class PersonManager { List<Person> Persons = new List<Person>();
public void ReadPersonHobbysLINQ(string personName) {
var matchpersons = from p in Persons where p.Name == personName select p; if (matchpersons.Any()) { var person = matchpersons.First(); foreach(var hobby in person.Hobbies) { } } }
public void ReadPersonHobbysForEach(string personName) {
foreach(var p in Persons) if(p.Name == personName) foreach (var hobby in p.Hobbies) { } }
} |
Dabei wird angenommen, dass die Liste Persons andersweitig mit Personen gefüllt wurde...
GURKE deluxe - Di 25.01.11 21:18
Hallo IsNull,
Ich habe dein Code mit der Foreach-Schleife ausprobiert. Dabei fiel mir auf, das die Liste komplett leer ist. Daraufhin habe ich ein Breakpoint beim Schreiben in die Liste gesetzt. Das macht er alles wie er es soll. Also keine Fehler oder so. Er lädt auch den richtigen String.
Was ist da falsch? :)
Gruß
Julian
Christian S. - Di 25.01.11 23:44
Hallo!
Bitte zeig mal Deinen Code, sonst kann man Dir schlecht helfen :-)
Grüße
Christian
GURKE deluxe - Mi 26.01.11 16:32
Na klar :D
Das mit Personen und Hobby war ein Beispiel hier sind Personen = Lehrer und Hobbys = Fächer xD
C#-Quelltext
1: 2:
| foreach (String s in Lehrer) LehrerListe.ParseLine(s); |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| public class LehrerListe { public string Name { get; set; }
private List<string> _Fächer = new List<string>(); public List<string> Fächer { get { return _Fächer; } }
public static LehrerListe ParseLine(string line) { string[] parts = line.Split('#'); if (parts.Length == 0) return null;
var result = new LehrerListe(); result.Name = parts[0]; for (int j = 1; j < parts.Length; j++) result.Fächer.Add(parts[j]); return result; } } |
Das ist der Code-Teil zum Speichern in die Liste.
Und hier der Code zum Auslesen:
C#-Quelltext
1: 2:
| PersonManager pm = new PersonManager(); pm.ReadPersonHobbysForEach(cbFach.Text); |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public class PersonManager { List<LehrerListe> LehrerListen = new List<LehrerListe>(); public void ReadPersonHobbysForEach(string Lehrername) {
foreach (var ll in LehrerListen) if (ll.Name == Lehrername) foreach (var Faecher in ll.Fächer) { MessageBox.Show(Faecher); } }
} |
Ich hoffe das hilft euch mir zu helfen :)
Gruß
Julian
Trashkid2000 - Mi 26.01.11 20:08
GURKE deluxe hat folgendes geschrieben : |
C#-Quelltext 1: 2:
| List<LehrerListe> LehrerListen = new List<LehrerListe>(); ... | |
Klar, dass sich bei der Erstellung keine Elemente in der List befinden... woher auch? Ausser Du übergibst im Konstruktor einen
IEnumerable<LehrerListe>.
Also, wenn Du eine neue Liste erstellst, dann musst Du sie auch irgendwann mal füllen. Jedenfalls, wenn dort Objekte drin gespeichert werden sollen.
GURKE deluxe - Mi 26.01.11 20:55
Hi,
Naja, aber der Code-Teil ist doch auch dazu gedacht Daten auszulesen und nicht zu speichern. Gespeichert wird ja schon früher...
IsNull - Fr 28.01.11 18:47
| Zitat: |
| Gespeichert wird ja schon früher... |
Ja ne! :)
Irgendwoher musst du ja mal die Personen-Liste haben und in deinen Code einlesen. Dabei erstellst du für jede Person ein "Personen-Objekt" und fügst das dem PersonManager in seine Liste hinzu. Woher die Daten auch immer kommen mögen.
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!