打印存储在类列表中的信息以进行控制台

时间:2019-01-23 15:04:38

标签: c# console

我是C#初学者,由于我是新手,所以我正在尝试学习编码的基本知识。我一直在看一些教程,并决定开始编写简单的代码,并在我学到更多知识时提高/添加更多功能。

当前,我正在创建一个简单的数据库,可以在其中存储有关人的一些信息。我决定尝试为此使用类,并在打印存储在列表中的数据时遇到问题。

我尝试了Console.WriteLine(people.ToString());,但没有用。

我尝试合并在另一篇文章中发现的string.Join(delimiter, list.Select(i => i.Boo).ToArray()),但没有这样做。

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

        Console.Write("How many people are to be stored?: ");

        int personCount = Convert.ToInt32(Console.ReadLine());

        for (int i=1; i<=personCount; i++)
        {
            Console.Write("Name of person "+ i + ":");
            string nameInput=Console.ReadLine();
            Console.Write("Age of "+ nameInput +": ");
            int ageInput= Convert.ToInt32(Console.ReadLine());
            Console.Write("Height of " + nameInput + ": ");
            double heightInput = Convert.ToDouble (Console.ReadLine());
            people.Add(new Person(nameInput, ageInput, heightInput));
        }

        // here goes (i think) the code to type info stored in list

        Console.WriteLine("Press ENTER to close.");

        Console.ReadLine();
    }
}
class Person
{
    public string name;
    public int age;
    public double height;

    public Person(string name, int age, double height)
    {
        this.name = name;
        this.age = age;
        this.height = height;
    }
}

我想要一个信息列表,相反,我仅获得以下信息:

System.Collections.Generic.List 1 [Studies.Person]`

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您需要覆盖Person类中的ToString方法并在那里处理输出。

Object.ToString方法返回:

  

代表当前对象的字符串。

这基本上是对象(人)的字符串表示形式。默认情况下,它将返回完整的类名,包括名称空间。当您将像人这样的对象传递给Console.WriteLine(期望使用string作为参数)时,它将自动调用ToString方法,框架中的每个对象都继承自Object 。这应该可以解释您的输出:

  

System.Collections.Generic.List

使用Console.WriteLine(people.ToString());时。它调用了ToStringList继承并打印全名的Object方法。

如果您在类中覆盖它,它将采用您的版本,您可以确定输出的外观

class Person
{
    public string name;
    public int age;
    public double height;

    public Person(string name, int age, double height)
    {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public override string ToString()
    {
        return $"Name: {name} Age: {age} Height: {height}";
    }
}

现在您可以使用string.Join

Console.WriteLine(String.Join(Environment.NewLine, people));

答案 1 :(得分:0)

问题是从ToString()(每个继承层次结构的根)继承的object的默认实现是打印类型名称。要使其正常工作,您必须覆盖ToString()并让其执行一些有用的操作

例如,在课堂上写人

public override string ToString()
{
    return $"Person {name}, aged by (age}, height = {height}";
}

请注意,此方法已被intdoubleDateTime之类的其他类型覆盖。但是,由于系统不知道人(或任何其他用户定义的类型)的有意义的字符串表示形式应该如何,因此它不提供此类替代。

答案 2 :(得分:0)

两个问题:

  • 您正在调用列表中的.ToString(),而不是单个Person
    您列表中的对象。所以你告诉机器是“告诉 我关于此列表,而不是其中的对象” 回复“这是Person对象的列表”。

  • 您的Person类没有.ToString()方法重写,因此当 您调用.ToString()。

因此,您需要在Person类中重写.ToString()方法,并遍历列表并为每个Person对象调用.ToString()。