方法返回名称,但返回数组第一个位置的名称:但我希望它返回薪水最高的兼职员工:
以下是我尝试过的方法:
public string PartTimeEmployeeWithHighestSalary()
{
string name = employees[0].GetName();
double salary = employees[0].GetSalary();
for (int i = 0; i < count; i++)
{
if (employees[i].GetSalary() > salary && employees[i] is PartTimeEmployee)
{
salary = employees[i].GetSalary();
name = employees[i].GetName();
}
}
return name;
}
这是程序代码。预期的结果是";Wills"但我得到了";Muwana";
static void Main(string[] args)
{
Employee EmpS1 = new ServiceEmployee("S123", "Muwana", "Sein",1000);
Employee EmpS2 = new ServiceEmployee("S124", "Prince", "Jack",1500);
Employee EmpS3 = new ServiceEmployee("S125", "Matengu", "Prince",6000);
Employee EmpP1 = new PartTimeEmployee("P133", "Mad", "Max",2500);
Employee EmpP2 = new PartTimeEmployee("P134", "Wills", "Sanjay",3000);
Employee EmpP3 = new PartTimeEmployee("P135", "Rick", "Sanchez",1000);
Employee EmpM1 = new ManagementEmployee("M143", "Morty", "Smith",1500);
Employee EmpM2 = new ManagementEmployee("M143", "Summer", "Smith",6500);
Employee EmpM3 = new ManagementEmployee("M144", "Beth", "Smith",6500);
HRDepartment company = new HRDepartment(500);
company.AddEmployee(EmpS1);
company.AddEmployee(EmpS2);
company.AddEmployee(EmpS3);
company.AddEmployee(EmpP1);
company.AddEmployee(EmpP2);
company.AddEmployee(EmpP3);
company.AddEmployee(EmpM1);
company.AddEmployee(EmpM2);
company.AddEmployee(EmpM3);
//-1. PartTime employee with highest salary
Console.WriteLine("PartTime employee with highest salary:{0}",company.PartTimeEmployeeWithHighestSalary());
您的代码没有那么糟糕,但这是错误的:
string name = employees[0].GetName();
double salary = employees[0].GetSalary();
只有当您能够保证员工[0]是兼职员工时,这才有效。
相反,将薪资初始化为-1。这应该行得通。当然,在执行循环之后,您还应该检查工资是否仍然为-1,这意味着循环没有遇到任何兼职员工。
正如评论中所指出的,问题很可能是循环条件中使用的count
变量。它的值是<0、0或1。因此,循环永远不会进入,或者在第一次迭代后停止。
有几种方法可以解决这个问题:
- 检查count的值并确保其与
employees
的长度对齐 - 请勿自行执行此类搜索,并使用标准库进行搜索:
public string PartTimeEmployeeWithHighestSalary() => employees
.OfType<PartTimeEmployee>()
.MaxBy(x => x.GetSalary())
.GetName();
// or in case employees might not contain any part-timers:
public string? PartTimeEmployeeWithHighestSalary() => employees
.OfType<PartTimeEmployee>()
.MaxBy(x => x.GetSalary())?
.GetName();
- 使用员工列表的
Count
属性(如果是数组,则为Length
;如果不确定,则为Count()
(,而不是count
变量/成员:
for (int i = 0; i < employees.Count; i++)
在这个答案中指出了另一个问题:您对name
和salaray
的初始化是错误的。这可以这样修复:
public string? PartTimeEmployeeWithHighestSalary()
{
string? name = null;
double salary = double.MinValue;
for (int i = 0; i < employees.Count(); i++)
{
// same as before
}
return name;
}
现在,如果公司中没有兼职员工,PartTimeEmployeeWithHighestSalary()
将返回null
。
尝试使用以下实现更新PartTimeEmployeeWithHighestSalary
public string PartTimeEmployeeWithHighestSalary()
{
return employees.OfType<PartTimeEmployee>().OrderByDescending(x => x.Salary).First().Name;
}