Im essayant actuellement de faire une application de carnet d'adresses qui contient des données de personne dans un objet qui est ensuite ajouté à une liste. Je suis en train de créer une méthode pour essayer de lister les données lorsque vous y êtes invité mais les informations ne sont pas affichées, est-ce que quelqu'un sait comment je peux résoudre ce problème?

namespace AddressBook
{
    class Student : Person
    {
    public String StudentID { get; set; }
    public String grade { get; set; }

    public List<Student> studentList = new List<Student>();

 public void addStudent(string firstName, string lastName, string address, string city, string country, string postcode, string StudentID, string grade )
    {
        Student student = new Student();
        student.firstName = firstName;
        student.lastName = lastName;
        student.address = address;
        student.city = city;
        student.country = country;
        student.postcode = postcode;
        student.StudentID = StudentID;
        student.grade = grade;
        studentList.Add(student);
    }

 public void listStudentData()
    {
        String fname ="", lname="", add="", city="", country="", post="", id="", grd = "";
        String[,] index = { { "First name: ", "Last Name: ", "Address: ", "City: ", "Country: ", "Postcode: ", "StudentID: ", "Grade: " }, { fname, lname, add, city, country, post, id, grd }, };
        for (int i = 0; i < studentList.Count; i++)
        {
            fname = (studentList[i].firstName.ToString());
            lname = (studentList[i].lastName.ToString());
            add = (studentList[i].address.ToString());
            city = (studentList[i].city.ToString());
            country = (studentList[i].country.ToString());
            post = (studentList[i].postcode.ToString());
            id = (studentList[i].StudentID.ToString());
            grd = (studentList[i].grade.ToString());
            Console.WriteLine(index[0, i] + index[1,i]);
        }
        Console.WriteLine("");
    }



}

}

Le format que je veux imprimer est "Prénom: John" "Nom de famille: Smith" etc.

Cependant le format actuel est: "Prénom:"

Tout conseil serait très apprécié

0
Jackington 16 nov. 2017 à 17:50

4 réponses

Meilleure réponse

Vous compliquez vraiment trop les choses, juste pour énumérer les étudiants. C'est aussi simple que ça:

public void ListStudentData()
{
    foreach (Student student in studentList)
    {
        Console.WriteLine("First Name: {0}", student.firstName);
        Console.WriteLine("Last Name: {0}", student.lastName);
        Console.WriteLine("Address: {0}", student.address);
        ...
        ...
        ...
    }
}

En outre, généralement en tant que convention de dénomination standard, les noms de méthode doivent commencer par une majuscule.

2
Icemanind 16 nov. 2017 à 14:59

En publiant aussi ma solution, vous pourriez la trouver utile.

Je vois dans l'exemple d'origine que la classe Person de base est manquante, en la fournissant ici:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
    public string PostCode { get; set; }


    public override string ToString()
    {
        return $"First name: {FirstName}, Last name: {LastName}, Address: {Address}, City: {City}, Country: {Country}, Post code: {PostCode}";
    }
}

Vous pouvez voir que nous remplaçons la méthode ToString () pour renvoyer la représentation littérale voulue. Comme d'autres l'ont souligné, il est toujours préférable d'utiliser la notation PascalCase pour les propriétés publiques en C # (convention commune). Vient ensuite la classe Student dérivée:

public class Student : Person
{
    public String StudentID { get; set; }
    public String Grade { get; set; }

    public override string ToString()
    {
        return $"{base.ToString()}, Student ID: {StudentID}, Grade: {Grade}";
    }
}

Ici, nous ajoutons les propriétés StudentID et Grade et remplaçons à nouveau la méthode ToString () de la classe Object. Le remplacement utilise la méthode ToString () de notre classe de base que nous avons écrite précédemment.

Enfin, un exemple d'impression d'une liste d'objets Student:

static void Main(string[] args)
{
    var students = new List<Student>();
    students.Add(
        new Student
        {
            FirstName = "John",
            LastName = "Doe",
            Address = "43 North West",
            City = "Capetown",
            Country = "South Africa",
            PostCode = "12345",
            Grade = "A+",
            StudentID = Guid.NewGuid().ToString("N")
        });

    foreach (Student student in students)
    {
        Console.WriteLine(student);
    }
}

Et la sortie est:

First name: John, Last name: Doe, Address: 43 North West, City: Capetown, Country: South Africa, Post code: 12345, Student ID: 975d7bf2e80f4406b14119f8fbc3018e, Grade: A+
1
Igors Sutovs 18 nov. 2017 à 09:27

Cela semble un choix de conception étrange que le studentList soit membre de votre classe Student. Il appartient en tant que membre de votre programme ou formulaire.

Mais pour le problème spécifique, regardez cette ligne:

String[,] index = { { "First name: ", "Last Name: ", "Address: ", "City: ", "Country: ", "Postcode: ", "StudentID: ", "Grade: " }, { fname, lname, add, city, country, post, id, grd }, };

À ce stade, toutes ces variables d'attribut (fname, lname, etc.) sont des chaînes vides. Vous attribuez ultérieurement des valeurs à ces variables:

fname = (studentList[i].firstName.ToString());
//...

Cependant, cela ne change pas le contenu du tableau!

J'utiliserai simplement la variable fname pour expliquer ce qui s'est passé. fname est une référence à un objet chaîne en mémoire. Initialement, il fait référence à une chaîne vide. Vous disposez également du tableau index qui comprend un certain nombre de références, et vous en définissez une pour qu'elle fasse référence au même objet chaîne vide que la référence fname. Cependant, ceci est une copie de cette référence. fname et la position index font référence au même objet en mémoire, mais ce sont des variables indépendantes. Vous attribuez maintenant une nouvelle valeur à fname. La variable fname fait référence à une chaîne différente en mémoire. Cependant, la position dans index n'a pas été modifiée et fait toujours référence à la même chaîne vide qu'elle avait au début.

Pour résoudre ce problème, vous pourriez vouloir surcharger la méthode .ToString() de votre classe Student (et peut-être aussi la Person et d'autres classes dérivées). Cela ressemblerait à quelque chose comme ceci:

public override string ToString()
{
    return string.Format("First name: {0}\nLast Name: {1}\nAddress: {2}\nCity: {3}\nCountry: {4}\nPostcode: {5}\nStudentID: {6}\nGrade: {7}\n",
        firstName,
        lastName,
        address,
        city,
        country,
        postcode,
        StudentID,
        grade);
}

Ceci est utile pour un certain nombre de raisons (dont la moindre n'est pas de vous aider à inspecter les objets Student dans le débogueur), mais pour cette question, cela vous permettra de réécrire le listStudentData() pour ressembler à ceci:

public void listStudentData()
{
    foreach(var student in studentList)
    {
        Console.WriteLine(student);
    }
}

Dans un programme plus grand et plus complexe où vous pourriez avoir besoin de plusieurs façons différentes d'afficher une personne, au lieu (ou en plus) de remplacer ToString(), vous ajouteriez une classe statique PersonFormatter qui contenait un certain nombre de méthodes pour convertir un Person ou Student en une chaîne avec diverses sorties.

1
Joel Coehoorn 16 nov. 2017 à 15:14

Remarque: ce n'est pas la meilleure solution, mais je veux juste que vous voyiez ce qui ne va pas avec votre code d'origine et comment le corriger au cas où vous rencontriez des problèmes similaires à l'avenir. Veuillez consulter les autres réponses pour les moyens les plus efficaces d'accomplir la tâche.

Lorsque vous avez initialisé le tableau, les valeurs de toutes les variables que vous vouliez imprimer sont des chaînes vides.

String fname ="", lname="", add="", city="", country="", post="", id="", grd = "";

Ce que vous devez faire si vous souhaitez continuer à utiliser votre méthode actuelle, est de mettre à jour les variables avec les valeurs réelles dans la boucle for.

Comme ça:

public void listStudentData()
{
    String fname ="", lname="", add="", city="", country="", post="", id="", grd = "";
    String[,] index = { { "First name: ", "Last Name: ", "Address: ", "City: ", "Country: ", "Postcode: ", "StudentID: ", "Grade: " }, { fname, lname, add, city, country, post, id, grd }, };
    for (int i = 0; i < studentList.Count; i++)
    {
        index[1,0] = studentList[i].firstName.ToString();
        index[1,1] = studentList[i].lastName.ToString();
        index[1,2] = studentList[i].address.ToString();
        index[1,3] = studentList[i].city.ToString();
        index[1,4] = studentList[i].country.ToString();
        index[1,5] = studentList[i].postcode.ToString();
        index[1,6] = studentList[i].StudentID.ToString();
        index[1,7] = studentList[i].grade.ToString();

        for (int j = 0; j < 8; j++)
        {
            Console.WriteLine(index[0, i] + index[1,j]);
        }        
    }
    Console.WriteLine("");
}
1
AmuletxHeart 16 nov. 2017 à 15:12
47332646