C# using IComparable<> and IComparer
本文关键字:gt and IComparer lt using IComparable | 更新日期: 2023-09-27 17:51:18
我在正确使用IComparable<>
接口时遇到了一点麻烦。我还创建了一个实现IComparer<>
的类。我几乎从一本书中复制了确切的编码示例,但重新设计了它以适应我的情况,但它似乎不能正常工作。一直提示"类型Lab4a.Employee
中不存在类型名称EmployeeComparer
"。据我所知,方法是存在的,所以我不确定是什么触发了这一点。谢谢你的建议
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lab4a
{
class Employee : IComparable<Employee>
{
private string _name = ""; // holds the employee name
private int _number = 0; // employee's unique id number
private decimal _rate = 0.0m; // employees pay rate
private double _hours = 0.0d; // hours worked by the employee
private decimal _gross = 0.0m; // gross pay for a single employee
public Employee(string name, int number, decimal rate, double hours)
{
// initialize variables
this._name = name;
this._number = number;
this._rate = rate;
this._hours = hours;
// if the employee works more than 40 hours, calculate the overtime pay
if (_hours > 40)
{
double overtimeHours = _hours - 40; // calculates overtime hours worked
decimal overtimePay = (_rate * 1.5m) * (decimal)overtimeHours; // calculates pay for overtime hours worked
_gross = Math.Round((_rate * 40) + overtimePay, 2); // calculates regular pay plus overtime pay
}
else // otherwise, calculate regular pay
{
_gross = Math.Round(_rate * (decimal)_hours, 2);
}
}
// Static method to get a comparer object
public static EmployeeComparer GetComparer()
{
return new Employee.EmployeeComparer();
}
// Default CompareTo method
public int CompareTo(Employee rhs)
{
return this._number.CompareTo(rhs._number);
}
// Special implementation to be called by custom comparer
public int CompareTo(Employee rhs, Employee.EmployeeComparer.ComparisonType Which)
{
switch (Which)
{
case Employee.EmployeeComparer.ComparisonType.name:
return this._name.CompareTo(rhs._name);
case Employee.EmployeeComparer.ComparisonType.empID:
return this._number.CompareTo(rhs._number);
case Employee.EmployeeComparer.ComparisonType.rate:
return this._rate.CompareTo(rhs._rate);
case Employee.EmployeeComparer.ComparisonType.hours:
return this._hours.CompareTo(rhs._hours);
case Employee.EmployeeComparer.ComparisonType.gross:
return this._gross.CompareTo(rhs._gross);
}
return 0;
}
public override string ToString()
{
string employeeString = String.Format("{0,-20} | {1, -10} | {2, -7} | {3, -7:#.00} | {4, 10}", _name, _number, _rate, _hours, _gross);
return employeeString;
}
public void PrintEmployee()
{
// displays employee data with proper spacing and divider bars
System.Console.WriteLine(String.Format("{0,-20} | {1, -10} | {2, -7} | {3, -7:#.00} | {4, 10}", _name, _number, _rate, _hours, _gross));
}
}
// Nested class which implements IComparer
public class EmployeeComparer : IComparer<Employee>
{
public Employee.EmployeeComparer.ComparisonType WhichComparison { get; set; }
// Enumeration of comparison types
public enum ComparisonType
{
name,
empID,
rate,
hours,
gross
};
public int Compare(Employee lhs, Employee rhs)
{
return lhs.CompareTo(rhs, WhichComparison);
}
}
}
EmployeeComparer
类型现在没有嵌套到Employee
类中。如果你想它嵌套移动它的声明在Employee
类
GetComparer函数
public static EmployeeComparer GetComparer()
{
return new Employee.EmployeeComparer();
}
将其替换为
public static EmployeeComparer GetComparer()
{
return new EmployeeComparer();
}
编译器正在尝试寻找Lab4a.Employee。EmployeeComparer,显然不存在。因为您的EmployeeComparer在Lab4a名称空间中,而不是在Lab4a中。员工名称空间。
可以:
public class Employee : IComparable<Employee>
{
private string _name = ""; // holds the employee name
private int _number = 0; // employee's unique id number
private decimal _rate = 0.0m; // employees pay rate
private double _hours = 0.0d; // hours worked by the employee
private decimal _gross = 0.0m; // gross pay for a single employee
public Employee(string name, int number, decimal rate, double hours)
{
// initialize variables
this._name = name;
this._number = number;
this._rate = rate;
this._hours = hours;
// if the employee works more than 40 hours, calculate the overtime pay
if (_hours > 40)
{
double overtimeHours = _hours - 40; // calculates overtime hours worked
decimal overtimePay = (_rate * 1.5m) * (decimal)overtimeHours; // calculates pay for overtime hours worked
_gross = Math.Round((_rate * 40) + overtimePay, 2); // calculates regular pay plus overtime pay
}
else // otherwise, calculate regular pay
{
_gross = Math.Round(_rate * (decimal)_hours, 2);
}
}
// Static method to get a comparer object
public static EmployeeComparer GetComparer()
{
return new EmployeeComparer();
}
// Default CompareTo method
public int CompareTo(Employee rhs)
{
return this._number.CompareTo(rhs._number);
}
// Special implementation to be called by custom comparer
public int CompareTo(Employee rhs, EmployeeComparer.ComparisonType Which)
{
switch (Which)
{
case EmployeeComparer.ComparisonType.name:
return this._name.CompareTo(rhs._name);
case EmployeeComparer.ComparisonType.empID:
return this._number.CompareTo(rhs._number);
case EmployeeComparer.ComparisonType.rate:
return this._rate.CompareTo(rhs._rate);
case EmployeeComparer.ComparisonType.hours:
return this._hours.CompareTo(rhs._hours);
case EmployeeComparer.ComparisonType.gross:
return this._gross.CompareTo(rhs._gross);
}
return 0;
}
public override string ToString()
{
string employeeString = String.Format("{0,-20} | {1, -10} | {2, -7} | {3, -7:#.00} | {4, 10}", _name, _number, _rate, _hours, _gross);
return employeeString;
}
public void PrintEmployee()
{
// displays employee data with proper spacing and divider bars
System.Console.WriteLine(String.Format("{0,-20} | {1, -10} | {2, -7} | {3, -7:#.00} | {4, 10}", _name, _number, _rate, _hours, _gross));
}
}
// Nested class which implements IComparer
public class EmployeeComparer : IComparer<Employee>
{
public EmployeeComparer.ComparisonType WhichComparison { get; set; }
// Enumeration of comparison types
public enum ComparisonType
{
name,
empID,
rate,
hours,
gross
};
public int Compare(Employee lhs, Employee rhs)
{
return lhs.CompareTo(rhs, WhichComparison);
}
}