C#使用IComparable<>和IComparer

时间:2014-03-21 17:31:11

标签: c# icomparable icomparer

我在使用IComparable<>界面时遇到了一些麻烦。我还创建了一个实现IComparer<>的类。我几乎从一本书中复制了确切的编码示例,但重新设计它以适应我的情况,但似乎没有正常运行。我不断收到错误消息EmployeeComparer类型中不存在类型名称Lab4a.Employee。据我所知,该方法存在并存在,所以我不确定是什么触发了这个。感谢您的任何建议

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

3 个答案:

答案 0 :(得分:1)

EmployeeComparer类目前没有嵌套到Employee类中。如果您想要,嵌套会在Employee类中移动其声明。

答案 1 :(得分:1)

在函数GetComparer中你有

public static EmployeeComparer GetComparer()
{
    return new Employee.EmployeeComparer();
}

只需将其替换为

即可
public static EmployeeComparer GetComparer()
{
    return new EmployeeComparer();
}

编译器正在尝试查找显然不存在的Lab4a.Employee.EmployeeComparer。因为您的EmployeeComparer在Lab4a名称空间中,而不在Lab4a.Employee名称空间中。

答案 2 :(得分:1)

这将有效:

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