【问题标题】:How do I send only specified members of an array to a ToString override?如何仅将数组的指定成员发送到 ToString 覆盖?
【发布时间】:2019-04-30 01:38:43
【问题描述】:

我当前的 C# 家庭作业需要使用一个包含 7 个员工记录的预定义数组,每个记录由一组属性组成。这些记录必须使用 foreach 循环从数组中提取所有员工记录,然后使用 ToString 的公共覆盖来显示具有特定列格式的记录。我已经能够毫无问题地实施这个阶段。

然后下一组要求要求我们仅显示服务时间少于一年或介于 1 到 5 年之间的员工记录,这就是我卡住的地方。

我们需要使用这个类来表示当前日期(从作业中复制和粘贴):

public static class GlobalVars
{
    public static DateTime reportDate = DateTime.Parse("02/28/2017");
}

我们还需要自己创建一个名为 YearsOfService 的原始方法来计算员工的服务年限,该方法将员工租用日期的年份与 GlobalVars 类中当前日期的年份进行比较,我已经在这里完成:

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 循环和 switch case,但我无法以排除/包含正确记录的方式构建语法。

【问题讨论】:

  • 我想在这个级别你已经知道如何写一个if 语句,对吗?好吧,这似乎就是你所需要的。在您的foreach 循环中,只需插入一个if 条件来检查YearsOfService 的值,并根据该条件决定是否将employee.ToString() 打印到控制台。

标签: c# foreach enums overriding tostring


【解决方案1】:

您可以通过以下两种方式之一来实现...

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 循环中代码评估是否应将员工记录打印到控制台

【讨论】:

  • 这很好用,非常感谢。我知道我可以使用 if 和 where 来过滤它,但由于我缺乏经验,我不知道如何以一种有效的方式分配变量和数学。我非常感谢您的帮助。
【解决方案2】:

您的过滤器可以是 Where 方法,这是 LINQ 大家族中最有用的方法之一。

var employeesFilter = employees.Where(employee => employee.YearsOfService > 5);
foreach (Employee employee in employeesFilter)
{
    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多