Создать класс Company с несколькими методами

Всем привет! В общем, нужно разработать класс Company в котором должны быть:

  • Закрытое поле employees (персонал) – массив типа Employee.
  • Конструктор, который получает массив сотрудников типа Employee произвольной длины
  • Метод GiveEverybodyBonus с денежным параметром companyBonus, задающим размер базовой премии для каждого сотрудника.
  • Метод TotalToPay, который возвращает общую сумму заработной платы всех сотрудников, включая начисленные бонусы.
  • Метод NameMaxSalary, возвращающий фамилию сотрудника, получившего максимальную заработную плату с учетом премии.

Я не понимаю как написать NameMaxSalary метод. Так же я не уверен в правильности написаных мной методов. Вот мой класс Company:

public class Company
  {
      private readonly Employee[] employees;

        public Company(int length, params Employee[] employees)
        {
            employees = new Employee[length];
        }

        public void GiveEverybodyBonus(decimal companyBonus)
        {
            
            for(int i = 0; i < employees.Length; i++)
            {
                if(employees[i] != null)
                    this.employees[i].SetBonus(companyBonus);
            }
        }
       
        public decimal TotalToPay()
        {
            for(int i = 0; i <= employees.Length; i++)
            {
                if (employees[i] != null)
                    return this.employees[i].ToPay();
            }
            return 0;
        }

        public Employee NameMaxSalary()
        {

        }
    }

Методы ToPay и SetBonus были созданы ранее в иных классах.

public virtual void SetBonus(decimal bonus)
        {
            this.bonus = bonus;
        }
 public decimal ToPay()
        {
            return salary + bonus;
        }

Вот класс Employee

public class Employee
    {
        // Define three private fields: 'name'(string), 'salary'(decimal), 'bonus'(decimal)
        private readonly string name;
        private decimal salary;
        private decimal bonus;

         // Define public property 'Name' for getting 'name'
        public string Name
        {
            get
            {
                return name;
            }
        }
        // Define public property 'Salary' for getting and setting 'salary'
        public decimal Salary
        {
            get
            {
                return salary;
            }
            set
            {
                if (value > 0)
                {
                    salary = value;
                }
            }
        }

        //Define constructor with two parameters: 'name'(string), 'salary'(decimal). Assign parameters to its fields
        public Employee(string name, decimal salary)
        {
            this.name = name;
            this.salary = salary;
        }

        //Define public virtual method 'SetBonus', that set value in 'bonus'
        public virtual void SetBonus(decimal bonus)
        {
            this.bonus = bonus;
        }

        //Define public method 'ToPay', that returns sum of salary and bonus 
        public decimal ToPay()
        {
            return salary + bonus;
        }
    }

Ответы (1 шт):

Автор решения: Faris

Попробуй использовать метод MaxBy() в массиве. Этот метод возвратит тебе экземпляр класса Employee.

.Net >= 6:
Employee MaxSalary = employees.MaxBy(x => x.ToPay());
.Net <= 5:
Employee MaxSalary = Array.Find<Employee>(employees, x => x.ToPay() == employees.Max(x => x.ToPay()));

Также метод TotalToPay() реализован не совсем правильно, так как он вернёт зарплату только первого not null объекта в массиве. В будущем запомните что return возвращает значение и сразу выходит из метода, не дожидаясь окончания цикла. Вы можете использовать такой метод решения для TotalToPay():

public decimal TotalToPay() => employees.Sum(x => x.ToPay());
→ Ссылка