如何仅将数组的指定成员发送到 ToString 覆盖?
How do I send only specified members of an array to a ToString override?
我当前的 C# 家庭作业要求使用包含 7 条员工记录的预定义数组,每条记录都包含一组属性。这些记录必须使用 foreach 循环从数组中提取所有员工记录,然后使用 public 覆盖 ToString 以显示具有特定列格式的记录。我已经能够毫无问题地实施这个阶段。
然后下一组要求希望我们只显示服务时间少于一年或 1 到 5 年之间的员工记录,这就是我被卡住的地方。
我们需要使用这个 class 来表示当前日期(从作业中复制粘贴):
public static class GlobalVars
{
public static DateTime reportDate = DateTime.Parse("02/28/2017");
}
我们还需要自己创建一个名为 YearsOfService 的原始方法来计算员工的服务年限,该方法将员工 hireDate 的年份与 GlobalVars 中当前日期的年份进行比较 class,我在这里完成了:
public int YearsOfService()
{
DateTime current = GlobalVars.reportDate;
int yearsOfService = current.Year - hireDate.Year;
return yearsOfService;
}
我们需要使用此语法在屏幕上打印记录(从作业中复制和粘贴):
Employee emp = new Employee();
Employee[] employees = Employee.GetEmployeeData();
Console.WriteLine(Employee.EmployeeReportTitle("Employee Report Data Dump"));
Console.WriteLine(Employee.ColumnHeader());
foreach (Employee employee in employees)
{
Console.WriteLine(employee.ToString());
}
这是我为列格式输出的格式化覆盖字符串:
public override string ToString()
{
return String.Format("{0,-10:D5} {1, -20}{2, -16}${3, -11}{4:MM/dd/yyyy} {5, 16:D2}",
empNumber, empName, empStatus, hourlyWage, hireDate, YearsOfService());
}
这可以很好地打印数组中的每条记录,但是如何在 foreach 级别插入要求?我需要实现一个过滤器,以便通过 ToString 打印的唯一记录是 yearsOfService 高于特定值或介于两个值之间的记录。
我已经尝试了 if/else 循环和切换大小写,但我无法按照正确记录 excluded/included.
的方式构建语法
您可以通过以下两种方式之一来完成...
var minYoS = 3;
var maxYoS = 5;
foreach (Employee employee in employees.Where(x => x.YearsOfService() >= minYoS && x.YearsOfService() <= maxYoS))
{
Console.WriteLine(employee.ToString());
}
或
var minYoS = 3;
var maxYoS = 5;
foreach (Employee employee in employees)
{
if(minYoS <= employee.YearsOfService() && maxYoS >= employee.YearsOfService()){
Console.WriteLine(employee.ToString());
}
}
第一个示例使用 LINQ 投影仅循环访问满足指定要求的员工。第二个遍历所有员工,然后在 foreach 循环中,代码评估是否应将员工记录打印到控制台
您的过滤器可以是 Where
方法,这是 LINQ 大家族中最有用的方法之一。
var employeesFilter = employees.Where(employee => employee.YearsOfService > 5);
foreach (Employee employee in employeesFilter)
{
// ...
}
我当前的 C# 家庭作业要求使用包含 7 条员工记录的预定义数组,每条记录都包含一组属性。这些记录必须使用 foreach 循环从数组中提取所有员工记录,然后使用 public 覆盖 ToString 以显示具有特定列格式的记录。我已经能够毫无问题地实施这个阶段。
然后下一组要求希望我们只显示服务时间少于一年或 1 到 5 年之间的员工记录,这就是我被卡住的地方。
我们需要使用这个 class 来表示当前日期(从作业中复制粘贴):
public static class GlobalVars
{
public static DateTime reportDate = DateTime.Parse("02/28/2017");
}
我们还需要自己创建一个名为 YearsOfService 的原始方法来计算员工的服务年限,该方法将员工 hireDate 的年份与 GlobalVars 中当前日期的年份进行比较 class,我在这里完成了:
public int YearsOfService()
{
DateTime current = GlobalVars.reportDate;
int yearsOfService = current.Year - hireDate.Year;
return yearsOfService;
}
我们需要使用此语法在屏幕上打印记录(从作业中复制和粘贴):
Employee emp = new Employee();
Employee[] employees = Employee.GetEmployeeData();
Console.WriteLine(Employee.EmployeeReportTitle("Employee Report Data Dump"));
Console.WriteLine(Employee.ColumnHeader());
foreach (Employee employee in employees)
{
Console.WriteLine(employee.ToString());
}
这是我为列格式输出的格式化覆盖字符串:
public override string ToString()
{
return String.Format("{0,-10:D5} {1, -20}{2, -16}${3, -11}{4:MM/dd/yyyy} {5, 16:D2}",
empNumber, empName, empStatus, hourlyWage, hireDate, YearsOfService());
}
这可以很好地打印数组中的每条记录,但是如何在 foreach 级别插入要求?我需要实现一个过滤器,以便通过 ToString 打印的唯一记录是 yearsOfService 高于特定值或介于两个值之间的记录。
我已经尝试了 if/else 循环和切换大小写,但我无法按照正确记录 excluded/included.
的方式构建语法您可以通过以下两种方式之一来完成...
var minYoS = 3;
var maxYoS = 5;
foreach (Employee employee in employees.Where(x => x.YearsOfService() >= minYoS && x.YearsOfService() <= maxYoS))
{
Console.WriteLine(employee.ToString());
}
或
var minYoS = 3;
var maxYoS = 5;
foreach (Employee employee in employees)
{
if(minYoS <= employee.YearsOfService() && maxYoS >= employee.YearsOfService()){
Console.WriteLine(employee.ToString());
}
}
第一个示例使用 LINQ 投影仅循环访问满足指定要求的员工。第二个遍历所有员工,然后在 foreach 循环中,代码评估是否应将员工记录打印到控制台
您的过滤器可以是 Where
方法,这是 LINQ 大家族中最有用的方法之一。
var employeesFilter = employees.Where(employee => employee.YearsOfService > 5);
foreach (Employee employee in employeesFilter)
{
// ...
}