2016-05-10 2 views
0

Ich bin neu in C# und lernen über List in OOP-Modell. Ich habe ein Problem beim Zugriff auf eine Liste, und wenn ich die Eingabeaufforderung benutze, ist sie leer.Versuchen, C# Listen und wie man darauf zugreifen, auch aus anderen Klassen

In der Suchklasse bekomme ich grundsätzlich eine Liste aller Personen (ich glaube ich bin) und suche nach den Erwachsenen (über 20 Jahre alt). Vom Main Ich versuche, die Liste der Erwachsenen auszudrucken. Es ist schwer, eine Antwort auf diese Frage zu finden.

Also das ist der Code:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Search s = new Search(); 
     List<Person> GameOfThrones = new List<Person>(); 

     GameOfThrones.Add(new Person("Rob Stark", 20, Gender.Male)); 
     GameOfThrones.Add(new Person("Sansa Stark", 16, Gender.Female)); 
     GameOfThrones.Add(new Person("The Mountain", 30, Gender.Transgender)); 
     GameOfThrones.Add(new Person("Mellisandra", 100, Gender.Female)); 
     GameOfThrones.Add(new Person("Ramsey Bolton", 20, Gender.Male)); 



     foreach(Person abc in s.getAdults()) 
     { 
      Console.WriteLine(abc.ToString()); 
     } 


     Console.ReadKey(); 
    } 

} 

class Search 
{ 
    private List<Person> allPersons = new List<Person>(); 

    public List<Person> Apl 
    { 
     get { return allPersons; } 
    } 
    public List<Person> getAdults() 
    { 
     List<Person> Adults = new List<Person>(); 
     foreach (Person test in allPersons) 
     { 

      if (test.Age > 20) 
      { 
       Adults.Add(test); 
       //Console.WriteLine(test.ToString() + "\n"); 
      } 
     } 
     return Adults; 
    } 

    public List<Person> allMales() 
    { 
     List<Person> males = new List<Person>(); 
     foreach(Person per in allPersons) 
     { 
      if(per.GenderType == Gender.Male) 
      { 
       males.Add(per); 
      } 
     } 
     return males; 
    } 
} 

class Person 
{ 
    public Person(string name, int age, Gender gen) 
    { 
     this.Name = name; 
     this.Age = age; 
     this.GenderType = gen; 
    } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public Gender GenderType { get; set; } 

    public override string ToString() 
    { 
     return "Name: " + Name + "\nAge: " + Age + "\nGender: " + GenderType; 
    } 
} 

Antwort

1

Sie sind nicht, wo die allPersons Instanz in Ihrer Search-Klasse Einstellung, so wird es immer Graf von:

Search s = new Search(); 
s.Apl.Add(new Person("Rob Stark", 20, Gender.Male)); 
s.Apl.Add(new Person("Sansa Stark", 16, Gender.Female)); 

Zusätzlich in getAdults(), könnten Sie den Code mit einer kurzen LINQ-Anweisung ersetzen 0, können Sie einen Parameter im Konstruktor von Such Klasse zum Beispiel wie hinzufügen:

class Search 
{ 
    public Search(List<Person> persons) 
    { 
     allPersons = persons; 
    } 
} 

und dann Seite beim Aufruf Sie müssen das weitergeben müssen:

List<Person> GameOfThrones = new List<Person>(); 

    GameOfThrones.Add(new Person("Rob Stark", 20, Gender.Male)); 
    GameOfThrones.Add(new Person("Sansa Stark", 16, Gender.Female)); 
    GameOfThrones.Add(new Person("The Mountain", 30, Gender.Transgender)); 
    GameOfThrones.Add(new Person("Mellisandra", 100, Gender.Female)); 
    GameOfThrones.Add(new Person("Ramsey Bolton", 20, Gender.Male)); 

    Search s = new Search(GameOfThrones); 
+0

Vielen Dank auch sehr hilfreiche Erklärung! – KingBee

0

Sie nie Ihre Liste der allPersons zu Search passieren - es ist immer nur eine leere Liste hat!


Sie konnten die erstellt List<Person> in die Search Klasse übergeben,

class Search 
{ 
    private List<Person> allPersons; 

    public Search(List<Person> allPersons) 
    { 
     this.allPersons = allPersons 
    } 
    .... 
} 

und

List<Person> GameOfThrones = new List<Person>(); 

GameOfThrones.Add(new Person("Rob Stark", 20, Gender.Male)); 
GameOfThrones.Add(new Person("Sansa Stark", 16, Gender.Female)); 
.... 

Search s = new Search(GameOfThrones); 

Ein paar andere Worte der Weisheit,

Dieser Block

public List<Person> getAdults() 
{ 
    List<Person> Adults = new List<Person>(); 
    foreach (Person test in allPersons) 
    { 

     if (test.Age > 20) 
     { 
      Adults.Add(test); 
      //Console.WriteLine(test.ToString() + "\n"); 
     } 
    } 
    return Adults; 
} 

kann sehr schnell und einfach mit LINQ

public List<Person> getAdults() 
{ 
    return allPersons.Where(p => p.Age > 20).ToList(); 
} 
+0

Haha Sie wissen nicht, wie oft ich die LINQ Antwort bekomme! Prost! Ich werde das irgendwann lernen, heißt das ein Prädikat? Wie auch immer, Danke! – KingBee

0

Sie haben eine neue List<Person> in Main, das ist so in Ihrer Search Klasse dem man keine Beziehung hat erstellt getan werden getAdults() immer Ausführung auf eine leere Sammlung.

Zugriff auf die List<Person> innerhalb der Search Klasse von Main.

public List<Person> getAdults() 
{ 
    return allPersons.Where(p => p.Age > 20).ToList(); 
} 
+0

Prost Mate! das hat funktioniert. Ich habe mich gefragt, warum es funktioniert hat, als ich ursprünglich im Main gesucht habe, aber als ich diese Suchklasse erstellt habe, würde es nicht funktionieren. Weil ich die instanziierten Personen nicht wirklich zur Suche überlasse. Mein Laptop wurde fast zu einem Papiergewicht, um Hilfe! – KingBee

+0

Kein Problem @KingBee, froh, dass es geholfen hat. –