C#打印具有3个属性的对象的项目列表

时间:2018-12-06 19:46:31

标签: c# list properties

我是C#的新手

当前代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Basic1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Employee> empList = new List<Employee>()
            {
                new Employee { FName = "Bill", LName = "Lucas", Id = 101 },
                new Employee { FName = "Steve", LName = "Lanes", Id = 102 },
                new Employee { FName = "Jeff", LName = "Clark", Id = 103 },
                new Employee { FName = "Joe", LName = "Thomas", Id = 104 },
                new Employee { FName = "Joe", LName = "Wang", Id = 105 },
                new Employee { FName = "Steven", LName = "Holmes", Id = 106 },
                new Employee { FName = "Mark", LName = "Lark", Id = 107 },
                new Employee { FName = "Larry", LName = "Good", Id = 108 },
                new Employee { FName = "Tim", LName = "Whiles", Id = 109 },
                new Employee { FName = "Jerry", LName = "Lee", Id = 110 }
            };
            List<Employee> empListJoe = new List<Employee>();
            foreach (Employee employee in empList)
            {
                if (employee.FName == "Joe")
                {
                    empListJoe.Add(employee);
                }
            }
            Console.WriteLine(empListJoe);
            Console.ReadLine();
        }
    }
    public class Employee
    {
        public string FName { get; set; }
        public string LName { get; set; }
        public int Id { get; set; }
    }
}

所以我创建了一个新列表,其中所有员工的名字均为"Joe"
但是,看来我无法正确打印项目列表,而是得到如下输出:

  

'System.Collections.Generic.List`1 [Basic1.Employee]

或只有两行

  

Basic1.Employee。

我已经尝试过每种方法,但与实际项目列表相比,stil的输出还是通用的。

Console.WriteLine(empListJoe);

Console.WriteLine(String.Join(" \n", empListJoe));

empListJoe.ForEach(Console.WriteLine);

Console.WriteLine(empListJoe.ToString());

顺便说一句,这一项有效:

Console.WriteLine($"Employee Name: {employee.FName} {employee.LName}, Employee ID: {employee.Id}");

但是我正在尝试从新列表中打印。 我想我缺少基本的东西了。

谢谢。

4 个答案:

答案 0 :(得分:2)

所有这些:

Console.WriteLine(empListJoe);
Console.WriteLine(String.Join(" \n", empListJoe));
empListJoe.ForEach(Console.WriteLine);
Console.WriteLine(empListJoe.ToString());

隐式或显式地使用类的ToString方法。由于未覆盖它,因此会出现意外错误(默认实现返回类名)。您可以在类中重写此方法,如下所示:

public override string ToString()
{
    return $"{FName} {LName}";
}

之后,显示列表的最佳猜测是:

Console.WriteLine(String.Join(" \n", empListJoe));

或者,您可以使用LINQ方法Select来获取所需格式的字符串列表,如下所示:

Console.WriteLine(String.Join(" \n", empListJoe.Select(e => $"{e.FName} {e.LName}")).ToArray());

您还可以使用LINQ方法根据姓名过滤员工。将所有这些放在一起,工作代码可能是:

var empListJoe = empList
  .Where(e => e.FName = "Joe")
  .Select(e => $"{e.FName} {e.LName}"))
  .ToArray();
Console.WriteLine(String.Join(" \n", empListJoe));

答案 1 :(得分:1)

在您的Employee类型中覆盖ToString()方法:

public class Employee
{
    public string FName { get; set; }
    public string LName { get; set; }
    public int Id { get; set; }

    public overrides string ToString()
    {
        return $"Name: {FName} {LName}, Id: {Id}";
    }
}

.Net不知道如何将随机类型转换为字符串,但是在没有其他可用方法时,重写ToString()方法将为它提供更好的默认值。

一旦有了这些,您还必须了解.Net不会自动将集合转换为字符串。您必须自己迭代集合,并输出每个项目的字符串值。有许多方法,包括基本的forforeach循环以及string.Join方法。

答案 2 :(得分:0)

     List<Employee> empListJoe = new List<Employee>();
     foreach (Employee employee in empList)
     {
        if (employee.FName == "Joe")
        {
           empListJoe.Add(employee);
        }
     }
     foreach (Employee employeee in empListJoe)
     {
        Console.WriteLine($"{employeee.FName} {employeee.LName}");
     }
     Console.ReadLine();

或者您可以只使用第一个循环,将Console.WriteLine ... line放在empListJoe.Add(employee);下;线。

答案 3 :(得分:0)

我认为您应该问自己两个问题:

  1. C#是否知道您要如何打印列表?
  2. C#是否知道如何打印列表中的每个元素?

两者的答案都是肯定的。

C#仅知道每个对象都有可以重写的ToString()方法。 当您直接尝试打印列表并看到默认输出时,它将调用它。

您必须编写代码以仅打印一个元素(编写函数/方法)。然后,您必须为列表中的每个元素手动调用此代码(函数/方法)以进行打印-foreach循环会很好。

如果您熟悉OOP,则可以为自定义类重写ToString方法。