繁体   English   中英

C#-打印/写出/更改可变对象列表,属性在另一个类中。 (很好的答案)

[英]C# - Print/write out/change a mutable list of objects, properties is in another class. (great answers)

长期的读者,第一次的海报。 我希望这不是重复的,但是我所看到的相似的东西都是针对其他语言或复杂的语言,我希望不是。 应该有一个简单的解决方案来帮助像我这样的所有初学者。

我正在尝试制作一个函数,以简单地打印出用户创建的对象,这些对象放在另一个类的列表中。

我的Employee对象课程:

    public int ID { get; set; } 
    public string FirstName { get; set; } 
ect...

我做了一个打印功能(如果可以使用):

public void PrintEmployee()
{
    Console.WriteLine("\nID:{0}\nFull Name: {1} {2}\nSocial Security Number: {3}\nWage: {4}\n", ID, FirstName, LastName, SocialNumber, HourWage);
}

构造函数// 无关紧要,但可以帮助其他人做类似的项目

    public Employee(int ID, string firstname, string lastname, string socialnumber, string hourwage)
    {
        ID = 0;
        FirstName = firstname;
        LastName = lastname;
        SocialNumber = socialnumber;
        HourWage = hourwage;
    }

带有类并创建对象的注册表类://原来无关紧要,但可以帮助其他人进行类似的项目。

public List<Employee> Accounts { get; set; }

    public Registry()
    {
        Accounts = new List<Employee>();
    }

    public void CreateAccount()
    {
        var employee = new Employee(0, "", "", "", "");

        Console.Write("Enter first name <Name>: "); 
        employee.FirstName = Console.ReadLine();

        Console.Write("Enter last name <Name>: ");
        employee.LastName = Console.ReadLine();

        Console.Write("Enter Social Security Number<YYMMDD-XXXX>: ");
        employee.SocialNumber = Console.ReadLine();

        Console.Write("Enter wage <XXXkr/h>: ");
        employee.HourWage = Console.ReadLine();

        employee.ID = Accounts.Count + 1;

        Accounts.Add(employee);

    }

我希望每个员工都以自己的格式打印,但是我首先尝试以任何方式打印它们。 在main方法中创建一个Registry对象并调用打印函数后,我在控制台中得到ConsoleApplicationName.Method 该功能应该很简单(我们才刚刚开始学习),我可能会感到尴尬,但是对于我一生来说,我不知道如何使它起作用。

我试图将Employee打印方法放入Console.WriteLine,但它抱怨静态/无效,我将所有属性更改为静态和/或创建了它们的实例,但这无济于事。 继承可以解决问题吗?

我可以通过将列表和函数放在Employee类中来使其工作? 有人告诉我,将类和对象按其本质划分是一种好习惯,要做一些事情但要做好。 我需要在某个地方定义如何打印每个员工,但我不知道在哪里。

我尝试过注册表中的方法,我尝试过:

public void PrintRegistry() //nr1
        {
            Accounts.ForEach(employee => Console.Write("{0}\n", employee));
        }

>            foreach(Employee employee in Accounts) // nr2
>             {
>                 Console.WriteLine(employee);
>             }

Accounts.ForEach(Console.WriteLine); // nr3

感谢您的帮助,如果我需要花几个小时才能完全理解您的答复,我们将很乐意投入。

您将在Employee类中需要自己的ToString实现。 您只需要重写它,并将您的PrintEmployee代码PrintEmployee新方法即可。

只是为了弄清楚我的意思,我为您提供了一个示例,说明了替代的外观:

public override string ToString()
{
    return string.Format("ID:{0}{5}Full Name: {1} {2}{5}Social Security Number: {3}{5}Wage: {4}{5}", ID, FirstName, LastName, SocialNumber, HourWage, Environment.NewLine);             
}

为您提供一些背景信息:c#中的每个类或结构都继承自Object类。 默认情况下, Object类已经具有ToString的实现。 此基本实现只会打印出Employee类的名称空间+类名。 但是使用上面的覆盖,您可以简单地编写如下内容,并获得所需的输出:

var employee = new Employee { Firstname = "Happy", Lastname = "Coder", ... }
Console.WriteLine(employee);

这是一个简单的解决方案

private void PrintRegistry()
{
    foreach(Employee employee in Accounts)
    {
        Console.WriteLine("\nID:{0}\nFull Name: {1} {2}\nSocial Security Number: {3}\nWage: {4}\n", employee.ID, employee.FirstName, employee.LastName, employee.SocialNumber, employee.HourWage);
    }
}

或者,如果“ PrintEmployee”过程(由于未返回值而无法运行)在“ Employee”类中。

private void PrintRegistry()
{
    foreach(Employee employee in Accounts)
    {
        employee.PrintEmployee();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM