Как отправить только указанные члены массива в переопределение ToString? - PullRequest
0 голосов
/ 30 апреля 2019

Мое текущее домашнее задание на 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 зацикливать и переключать регистры, но я не могу структурировать синтаксис так, чтобы правильные записи были исключены / включены.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Ваш фильтр может быть методом Where, одним из самых полезных методов великого семейства LINQ.

var employeesFilter = employees.Where(employee => employee.YearsOfService > 5);
foreach (Employee employee in employeesFilter)
{
    // ...
}
0 голосов
/ 30 апреля 2019

Вы можете сделать это одним из этих двух способов ...

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 код оценивает, должна ли запись сотрудника выводиться на консоль или нет

...