Реализация Icomparable в классе налогоплательщиков для сортировки по налогу.

Я не могу реализовать Icomparable CompareTo для сравнения объектов налогоплательщиков на основе причитающихся налогов. Может ли кто-нибудь помочь мне с сравнимой реализацией класса налогоплательщиков?? Я хочу реализовать icomparable, как здесь. Интерфейсы — это новая тема для меня. Пожалуйста, помогите http://www.dotnetperls.com/icomparable

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Taxes
{
    class Rates
    {
        // Create a class named rates that has the following data members: 
        private int incomeLimit;
        private double lowTaxRate;
        private double highTaxRate;

        public int IncomeLimit  // use read-only accessor.
        { get { return incomeLimit; } }

        public double LowTaxRate // use read-only accessor.
        { get { return lowTaxRate; } }

        public double HighTaxRate // use read-only accessor.
        { get { return highTaxRate; } }

        //A class constructor that assigns default values of limit=30000, low rate = .15 and high rate = .28.
        public Rates()
        {
            int limit = 30000;
            double lowRate = .15;
            double highRate = .28;

            incomeLimit = limit;
            lowTaxRate = lowRate;
            highTaxRate = highRate;
        }

        //A class constructor that takes three parameters to assign input values for limit, low rate and high rate.
        public Rates(int limit, double lowRate, double highRate)
        {

        }

        //  A CalculateTax method that takes an income parameter and computes the tax as follows:
        public int CalculateTax(int income)
        {
            int limit = 0;
            double lowRate = 0;
            double highRate = 0;
            int taxOwed = 0;

            //  If income is less than the limit then return the tax as income times low rate.
            if (income < limit)
                taxOwed = Convert.ToInt32(income * lowRate);
            //  If income is greater than or equal to the limit then return the tax as income times high rate.
            if (income >= limit)
                taxOwed = Convert.ToInt32(income * highRate);
            return taxOwed;
        }
    }  //end class Rates

    //  Create a class named Taxpayer that has the following data members:
    public class Taxpayer
    {
        //Social Security number (use type string, no dashes between groups).  Use get and set accessors.
        string SSN
        { get; set; }

        int yearlyGrossIncome // Use get and set accessors.
        { get; set; }

        public int taxOwed  //  Use read-only accessor.
        {
            get { return taxOwed; }
        }

        // **  The Taxpayer class should be set up so that its objects are comparable to each other based on tax owed.
        class taxpayer : IComparable
        {
            public int taxOwed { get; set; }
            public int income { get; set; }

            int IComparable.CompareTo(Object o)
            {
                int returnVal;
                taxpayer temp = (taxpayer)o;
                if (this.taxOwed > temp.taxOwed)
                    returnVal = 1;
                else
                    if (this.taxOwed < temp.taxOwed)
                        returnVal = -1;
                    else
                        returnVal = 0;
                return returnVal;


            }  // End IComparable.CompareTo
        } //end taxpayer  IComparable class

        //  **The tax should be calculated whenever the income is set.
        //  The Taxpayer class should have a getRates class method that has the following.
        public static void GetRates()
        {
            //  Local method data members for income limit, low rate and high rate.
            int incomeLimit = 0;
            double lowRate;
            double highRate;
            string userInput;

            //  Prompt the user to enter a selection for either default settings or user input of settings.
            Console.Write("Would you like to enter your own values? (enter 0) or would you like to use the default values? (enter 1):  ");

            /*   If the user selects default the default values you will instantiate a rates object using the default constructor
            * and set the Taxpayer class data member for tax equal to the value returned from calling the rates object CalculateTax method.*/
            userInput = Convert.ToString(Console.ReadLine());

            if (userInput == "1")
            {
                Rates rates = new Rates();
                rates.CalculateTax(incomeLimit);
            } // end if

            /*  If the user selects to enter the rates data then prompt the user to enter values for income limit, low rate and high rate, 
             * instantiate a rates object using the three-argument constructor passing those three entries as the constructor arguments and 
             * set the Taxpayer class data member for tax equal to the valuereturned from calling the rates object CalculateTax method. */

            if (userInput == "0")
            {
                Console.Write("Please enter the income limit: ");
                incomeLimit = Convert.ToInt32(Console.ReadLine());
                Console.Write("Please enter the low rate: ");
                lowRate = Convert.ToDouble(Console.ReadLine());
                Console.Write("Please enter the high rate: ");
                highRate = Convert.ToDouble(Console.ReadLine());

                Rates rates = new Rates(incomeLimit, lowRate, highRate);
                rates.CalculateTax(incomeLimit);

            }  // end if
        }  //end GetRates class



        static void Main(string[] args)
        {
            //  instantiate an array of five (5) Taxpayer objects.

            string SSN = "0";
            int income = 0;
            int tax = 0;
            int x = 1;
            Taxpayer[] taxArray = new Taxpayer[5];


            //  Implement a for-loop that will prompt the user to enter the Social Security Number and gross income.
            for (x = 1; x < taxArray.Length; x++)
            {
                taxArray[x] = new Taxpayer();
                Console.Write("Please enter the Social Security Number for taxpayer {0}:  ", x);
                taxArray[x].SSN = Console.ReadLine();

                //SSN = String.Format("{0:000-00-0000}");
                Console.Write("Please enter the gross income for taxpayer {0}:  ", x);
                taxArray[x].yearlyGrossIncome = Convert.ToInt32(Console.ReadLine());

                Taxpayer.GetRates();

            }  //end for

            //  Implement a for-loop that will display each object as formatted taxpayer SSN, income and calculated tax.
            for (int i = 0; i < 5; i++)
            {

                Console.WriteLine("Taxpayer # {0} SSN: {1}, Income is {2:c}, Tax is {3:c}", i, SSN, income, tax);
            } // end for



            //  Implement a for-loop that will sort the five objects in order by the amount of tax owed and then display 
            //each object as formatted taxpayer SSN, income and calculated tax.

            Array.Sort(taxArray);
            Console.WriteLine("Sorted by tax owed");
            for (int i = 0; x < taxArray.Length; i++)
            {
                Console.WriteLine("Taxpayer # {0} SSN: {1}, Income is {2:c}, Tax is {3:c}", i, SSN, income, tax);


            }


        }  //end main
    } //  end Taxpayer class


}  //end namespace

//  Internal documentation

.


person Anjana Sharma    schedule 15.01.2012    source источник
comment
Слишком много кода. Пожалуйста, публикуйте только соответствующие части. Также объясните, почему вы не можете реализовать эти интерфейсы. В чем именно проблема?   -  person Oded    schedule 16.01.2012
comment
@Oded прав, потому что если вы хотите реализовать IComparable‹›, вам нужны только классы, которые вы хотите сравнить. Насколько я понимаю, вы хотите сравнить объекты налогоплательщиков друг с другом, чтобы вы могли просто перечислить класс налогоплательщиков. Проверьте ответы ниже, вам нужна дополнительная помощь?   -  person Mzn    schedule 16.01.2012


Ответы (2)


Вам нужно реализовать IComparable<Taxpayer> в общедоступном классе и исключить частный класс taxpayer.

Вот переписывание первой части класса Taxpayer:

public class Taxpayer : IComparable<Taxpayer>
{
    //Social Security number (use type string, no dashes between groups).  Use get and set accessors.
    string SSN
    { get; set; }

    int yearlyGrossIncome // Use get and set accessors.
    { get; set; }

    public int taxOwed  //  Use read-only accessor.
    {
        get { return taxOwed; }
    }

    #region IComparable<Taxpayer> Members

    int IComparable<Taxpayer>.CompareTo(Taxpayer other)
    {
        if (this.taxOwed > other.taxOwed)
            return 1;
        else
            if (this.taxOwed < other.taxOwed)
                return -1;
            else
                return 0;
    }

    #endregion

    //  **The tax should be calculated whenever the income is set.
    //  The Taxpayer class should have a getRates class method that has the following.
    public static void GetRates()
person competent_tech    schedule 15.01.2012

Вы уже реализовали интерфейс IComparable. Я предлагаю вам использовать IComparable<taxpayer>.

Вот как вы могли бы реализовать IComparable<taxpayer> в классе taxpayer: вам не нужно добавлять операторы if внутрь метода CompareTo. Верните отрицательное значение, если значение this меньше, а other больше. Верните положительный результат, если верно обратное. Возвращает ноль, если они равны. Это случай простого вычитания их друг из друга this.taxOwed - other.taxOwed

class taxpayer : IComparable<taxpayer>
{
    public int taxOwed { get; set; }
    public int income { get; set; }

    public int CompareTo(taxpayer other)
    {
        return taxOwed - other.taxOwed;
    }
} //end taxpayer  IComparable 

Если вы используете это так:

    public static List<taxpayer> taxPayers = new List<taxpayer>()
    {
        new taxpayer() { income = 1, taxOwed = 1000 },
        new taxpayer() { income = 2, taxOwed = 120 },
        new taxpayer() { income = 3, taxOwed = 7812 },
        new taxpayer() { income = 4, taxOwed = 4210 },
        new taxpayer() { income = 5, taxOwed = 400 },
        new taxpayer() { income = 6, taxOwed = 230 },
    };

    static void Main()
    {
        taxPayers.Sort();

        foreach (var t in taxPayers)
            Console.WriteLine(t.taxOwed);
    }

Результат будет:

120
230
400
1000
4210
7812

Обновление Меня смутил код и я не обратил внимания, что там два класса taxpayer и Taxpayer. Зачем тебе они оба? Вам нужен только один, и вы можете реализовать IComparable<Taxpayer>, как указано выше.

person Mzn    schedule 15.01.2012
comment
если вы хотите, чтобы они сортировались по убыванию, а не по возрастанию, как указано выше, ‹code›возвратите other.taxOwed - taxOwed;‹/code› в сравнении. - person Mzn; 16.01.2012