我是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}");
但是我正在尝试从新列表中打印。 我想我缺少基本的东西了。
谢谢。
答案 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不会自动将集合转换为字符串。您必须自己迭代集合,并输出每个项目的字符串值。有许多方法,包括基本的for
或foreach
循环以及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)
我认为您应该问自己两个问题:
两者的答案都是肯定的。
C#仅知道每个对象都有可以重写的ToString()方法。 当您直接尝试打印列表并看到默认输出时,它将调用它。
您必须编写代码以仅打印一个元素(编写函数/方法)。然后,您必须为列表中的每个元素手动调用此代码(函数/方法)以进行打印-foreach循环会很好。
如果您熟悉OOP,则可以为自定义类重写ToString方法。