Autor Beitrag
GURKE deluxe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 91
Erhaltene Danke: 1

Win 7 Home Premium x64, Win XP Home Edition v2002
C# Microsoft Visual C# 2010 Express
BeitragVerfasst: Mo 24.01.11 22:04 
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:
ausblenden 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:
ausblenden 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]); //Hier soll die Person in die Liste gespeichert werden. Wie sag ich ihm das?
                    for (int j = 1; j < LF.Count(); j++)
                    //Hier würden jetzt die Hobbys in die Liste gespeichert. Wie mach ich das?
                }



Wie befülle ich jetzt also diese Doppelte Liste?

Gruß
Julian
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 24.01.11 22:23 
Hallo!

Ich würde eine Klasse "Person" vorschlagen:

ausblenden 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: GURKE deluxe
GURKE deluxe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 91
Erhaltene Danke: 1

Win 7 Home Premium x64, Win XP Home Edition v2002
C# Microsoft Visual C# 2010 Express
BeitragVerfasst: Di 25.01.11 01:26 
Hallo Christian,
Erstmal danke für deine schnelle Antwort!
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: Di 25.01.11 10:32 
so z.B:
1. Möglichkeit mit foreach, 2te möglichkeit LINQ
ausblenden 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>();

            // LINQ
            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) {
                        //--> hobby string
                    }
                }
            }

            // Foreach
            public void ReadPersonHobbysForEach(string personName) {

                foreach(var p in Persons)
                    if(p.Name == personName)
                        foreach (var hobby in p.Hobbies) {
                            //--> hobby string
                        }
            }

        }

Dabei wird angenommen, dass die Liste Persons andersweitig mit Personen gefüllt wurde...

Für diesen Beitrag haben gedankt: GURKE deluxe
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 25.01.11 15:30 
Das finde ich ja lustig, in meinem Artikel Kommunikation von 2 Forms habe ich als Beispiel auch eine PersonManagement-Klasse mit Unterklassen Person und Hobby (s. Link 'PersonManagement.zip' unten im Artikel).

@GURKE deluxe, kannst es dir ja mal anschauen, ich benutze dort aber die XML-Serialisierung (da dies einfacher als das händische Rausschreiben in eine Textdatei ist).
GURKE deluxe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 91
Erhaltene Danke: 1

Win 7 Home Premium x64, Win XP Home Edition v2002
C# Microsoft Visual C# 2010 Express
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 25.01.11 23:44 
Hallo!

Bitte zeig mal Deinen Code, sonst kann man Dir schlecht helfen :-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
GURKE deluxe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 91
Erhaltene Danke: 1

Win 7 Home Premium x64, Win XP Home Edition v2002
C# Microsoft Visual C# 2010 Express
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
2:
foreach (String s in Lehrer)
LehrerListe.ParseLine(s);


ausblenden 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:
ausblenden C#-Quelltext
1:
2:
PersonManager pm = new PersonManager();
            pm.ReadPersonHobbysForEach(cbFach.Text);


ausblenden 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>(); //<-- Count = 0

            public void ReadPersonHobbysForEach(string Lehrername)
            {

                foreach (var ll in LehrerListen)
                    if (ll.Name == Lehrername)
                        foreach (var Faecher in ll.Fächer)
                        {
                            MessageBox.Show(Faecher);
                            //--> hobby string
                        }
            }

        }


Ich hoffe das hilft euch mir zu helfen :)

Gruß
Julian
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mi 26.01.11 20:08 
user profile iconGURKE deluxe hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
2:
List<LehrerListe> LehrerListen = new List<LehrerListe>(); //<-- Count = 0
...
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 91
Erhaltene Danke: 1

Win 7 Home Premium x64, Win XP Home Edition v2002
C# Microsoft Visual C# 2010 Express
BeitragVerfasst: Mi 26.01.11 20:55 
Hi,
user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconGURKE deluxe hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
2:
List<LehrerListe> LehrerListen = new List<LehrerListe>(); //<-- Count = 0
...
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.


Naja, aber der Code-Teil ist doch auch dazu gedacht Daten auszulesen und nicht zu speichern. Gespeichert wird ja schon früher...
IsNull
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: 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.