我正试图实现这个算法来显示薪水最高的人的名字

  • 本文关键字:显示 实现 算法 c# arrays algorithm
  • 更新时间 :
  • 英文 :


方法返回名称,但返回数组第一个位置的名称:但我希望它返回薪水最高的兼职员工:

以下是我尝试过的方法:

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++)

在这个答案中指出了另一个问题:您对namesalaray的初始化是错误的。这可以这样修复:

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;
}

最新更新