Сортировка по нескольким полям - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день.Есть следующая многострадальная задача: Построить три класса (базовый и 2 потомка), описывающих некоторых работников с почасовой оплатой (один из потомков) и фиксированной оплатой (второй потомок). Описать в базовом классе абстрактный метод для расчета среднемесячной заработной платы. Для «повременщиков» формула для расчета такова: «среднемесячная заработная плата = 20.8 * 8 * почасовую ставку», для работников с фиксированной оплатой «среднемесячная заработная плата = фиксированной месячной оплате». a) Упорядочить всю последовательность работников по убыванию среднемесячного заработка. При совпадении зарплаты – упорядочивать данные по алфавиту по имени. Вывести идентификатор работника, имя и среднемесячный заработок для всех элементов списка. b) Вывести первые 5 имен работников из полученного в пункте а) списка. c) Вывести последние 3 идентификатора работников из полученного в пункте а) списка. d) Организовать запись и чтение коллекции в/из файл. e) Организовать обработку некорректного формата входного файла. Вот,что у меня есть, но я не могу сделать даже пункт а). У меня не получается сделать сортировку по 2ум полям (оплата и имя), да я даже по одному полю не могу сделать т.к. не знаю как вычленить из созданного списка интересующее меня поля.Сижу безрезультатно второй день, не могу понять то ли я изначально себя в такие условия загнал или совсем бездарный,что не могу типовые решения сюда применить.В общем прошу помочь, а если кому не лень, то мне полезно было бы и на решения остальных пунктов посмотреть.Предпочтительнее использовать не продвинутые методы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ShowTest
{
    abstract class Worker
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public double PayType { get; set; }
        public abstract void CalculatePay();
    }
    class HourlyPayWorker : Worker
    {
        public HourlyPayWorker(int id, string name, float paytype)
        {
            ID = id;
            Name = name;
            PayType = paytype;
        }
        public override void CalculatePay()
        {
            Console.WriteLine("ID= " + ID + " Имя рабочего с почасовой оплатой: " + Name + "\n" + "Его ежемесячная зарплата= " + 20.8 * 8 * PayType + "\n");
            PayType = 20.8 * 8 * PayType;
        }
        public override string ToString()
        {
            return PayType.ToString();
        }
    }
    class StaticPayWorker : Worker
    {
        public StaticPayWorker(int id, string name, float paytype)
        {
            ID = id;
            Name = name;
            PayType = paytype;
 
        }
        public override void CalculatePay()
        {
            Console.WriteLine("ID= " + ID + " Имя рабочего с фиксированной оплатой: " + Name + "\n" + "Его ежемесячная зарплата= " + PayType);
        }
 
    }
    class Program
    {
        static double MyComparer(Worker x, Worker y)
        {
            return x.PayType - y.PayType;
        }
        static void Main(string[] args)
        {
            
            List<Worker> workers = new List<Worker>();
            workers.Add(new HourlyPayWorker(43, "Андрей", 80));
            workers.Add(new StaticPayWorker(28, "Николай", 15000));
            workers.Add(new HourlyPayWorker(01, "Василий", 150));
            workers.Add(new StaticPayWorker(152, "Максим", 28000));
            workers.Add(new HourlyPayWorker(96, "Игорь", 110));
            workers.Add(new HourlyPayWorker(3, "Алексей", 200));
            workers.Add(new StaticPayWorker(8769, "Елена", 19000));
            workers.Add(new StaticPayWorker(61, "Ирина", 22000));
            workers.Add(new StaticPayWorker(82, "Name1", 90000));
            workers.Add(new HourlyPayWorker(88, "Name2", 88));
            foreach (Worker worker in workers)
                worker.CalculatePay();
            Console.WriteLine("--------------------------------------------" + "\n" + "--------------------------------------------");
            Console.WriteLine("Сортировка по возрастанию");
            Console.ReadKey();
Подтер лишнее,что сразу не заметил
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ShowTest
{
    abstract class Worker
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public double PayType { get; set; }
        public abstract void CalculatePay();
    }
    class HourlyPayWorker : Worker
    {
        public HourlyPayWorker(int id, string name, float paytype)
        {
            ID = id;
            Name = name;
            PayType = paytype;
        }
        public override void CalculatePay()
        {
            Console.WriteLine("ID= " + ID + " Имя рабочего с почасовой оплатой: " + Name + "\n" + "Его ежемесячная зарплата= " + 20.8 * 8 * PayType + "\n");
            PayType = 20.8 * 8 * PayType;
        }
 
    }
    class StaticPayWorker : Worker
    {
        public StaticPayWorker(int id, string name, float paytype)
        {
            ID = id;
            Name = name;
            PayType = paytype;
 
        }
        public override void CalculatePay()
        {
            Console.WriteLine("ID= " + ID + " Имя рабочего с фиксированной оплатой: " + Name + "\n" + "Его ежемесячная зарплата= " + PayType);
        }
 
    }
    class Program
    {
        
        static void Main(string[] args)
        {
            
            List<Worker> workers = new List<Worker>();
            workers.Add(new HourlyPayWorker(43, "Андрей", 80));
            workers.Add(new StaticPayWorker(28, "Николай", 15000));
            workers.Add(new HourlyPayWorker(01, "Василий", 150));
            workers.Add(new StaticPayWorker(152, "Максим", 28000));
            workers.Add(new HourlyPayWorker(96, "Игорь", 110));
            workers.Add(new HourlyPayWorker(3, "Алексей", 200));
            workers.Add(new StaticPayWorker(8769, "Елена", 19000));
            workers.Add(new StaticPayWorker(61, "Ирина", 22000));
            workers.Add(new StaticPayWorker(82, "Name1", 90000));
            workers.Add(new HourlyPayWorker(88, "Name2", 88));
            foreach (Worker worker in workers)
                worker.CalculatePay();
            Console.WriteLine("--------------------------------------------" + "\n" + "--------------------------------------------");
            Console.WriteLine("Сортировка по возрастанию");
            Console.ReadKey();

Решение задачи: «Сортировка по нескольким полям»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
 
namespace ShowTest
{
    [Serializable]
    internal abstract class Worker : IComparable<Worker>
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public double Salary { get; protected set; }
        public abstract void CalculateSalary();
 
        public Worker(int id, string name)
        {
            ID = id;
            Name = name;
        }
 
        public int CompareTo(Worker other)
        {
            var res = -Salary.CompareTo(other.Salary);
            if (res == 0)
                res = Name.CompareTo(other.Name);
 
            return res;
        }
 
        public override string ToString()
        {
            return Salary + " " + Name;
        }
    }
 
    [Serializable]
    internal class HourlyPayWorker : Worker
    {
        public double HourlySalary { get; set; }
 
        public HourlyPayWorker(int id, string name, double hourlySalary): base(id, name)
        {
            HourlySalary = hourlySalary;
        }
 
        public override void CalculateSalary()
        {
            Salary = 20.8*8*HourlySalary;
        }
    }
 
    [Serializable]
    internal class StaticPayWorker : Worker
    {
        public StaticPayWorker(int id, string name, double salary) : base(id, name)
        {
            Salary = salary;
        }
 
        public override void CalculateSalary()
        {
        }
    }
 
    internal class Program
    {
        private static void Main(string[] args)
        {
 
            var workers = new List<Worker>();
            workers.Add(new HourlyPayWorker(43, "Андрей", 80));
            workers.Add(new StaticPayWorker(28, "Николай", 15000));
            workers.Add(new HourlyPayWorker(01, "Василий", 150));
            workers.Add(new StaticPayWorker(152, "Максим", 28000));
            workers.Add(new HourlyPayWorker(96, "Игорь", 110));
            workers.Add(new HourlyPayWorker(3, "Алексей", 150));
            workers.Add(new StaticPayWorker(8769, "Елена", 28000));
            workers.Add(new StaticPayWorker(61, "Ирина", 22000));
            workers.Add(new StaticPayWorker(82, "Name1", 90000));
            workers.Add(new HourlyPayWorker(88, "Name2", 150));
            foreach (Worker worker in workers)
                worker.CalculateSalary();
 
            Console.WriteLine("--------------------------------------------");
            Console.WriteLine("Запись в файл ...");
            using (var fs = new FileStream("C:\\temp.bin", FileMode.Create))
                new BinaryFormatter().Serialize(fs, workers);
 
            Console.WriteLine("--------------------------------------------");
            Console.WriteLine("Чтение из файла ...");
            using (var fs = new FileStream("C:\\temp.bin", FileMode.Open))
            try
            {
                workers = (List<Worker>) new BinaryFormatter().Deserialize(fs);
            }catch(Exception ex)
            {
                Console.WriteLine("Incorrect file format or file does not exist");
                Console.ReadLine();
                return;
            }
 
            Console.WriteLine("--------------------------------------------");
            Console.WriteLine("Сортировка по возрастанию:");
 
            workers.Sort();
 
            foreach (Worker worker in workers)
                Console.WriteLine(worker);
 
            Console.ReadKey();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы