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