Сортировка по нескольким полям - 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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д