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

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

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

Добрый день.Есть следующая многострадальная задача: Построить три класса (базовый и 2 потомка), описывающих некоторых работников с почасовой оплатой (один из потомков) и фиксированной оплатой (второй потомок). Описать в базовом классе абстрактный метод для расчета среднемесячной заработной платы. Для «повременщиков» формула для расчета такова: «среднемесячная заработная плата = 20.8 * 8 * почасовую ставку», для работников с фиксированной оплатой «среднемесячная заработная плата = фиксированной месячной оплате». a) Упорядочить всю последовательность работников по убыванию среднемесячного заработка. При совпадении зарплаты – упорядочивать данные по алфавиту по имени. Вывести идентификатор работника, имя и среднемесячный заработок для всех элементов списка. b) Вывести первые 5 имен работников из полученного в пункте а) списка. c) Вывести последние 3 идентификатора работников из полученного в пункте а) списка. d) Организовать запись и чтение коллекции в/из файл. e) Организовать обработку некорректного формата входного файла. Вот,что у меня есть, но я не могу сделать даже пункт а). У меня не получается сделать сортировку по 2ум полям (оплата и имя), да я даже по одному полю не могу сделать т.к. не знаю как вычленить из созданного списка интересующее меня поля.Сижу безрезультатно второй день, не могу понять то ли я изначально себя в такие условия загнал или совсем бездарный,что не могу типовые решения сюда применить.В общем прошу помочь, а если кому не лень, то мне полезно было бы и на решения остальных пунктов посмотреть.Предпочтительнее использовать не продвинутые методы
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace ShowTest
  7. {
  8. abstract class Worker
  9. {
  10. public int ID { get; set; }
  11. public string Name { get; set; }
  12. public double PayType { get; set; }
  13. public abstract void CalculatePay();
  14. }
  15. class HourlyPayWorker : Worker
  16. {
  17. public HourlyPayWorker(int id, string name, float paytype)
  18. {
  19. ID = id;
  20. Name = name;
  21. PayType = paytype;
  22. }
  23. public override void CalculatePay()
  24. {
  25. Console.WriteLine("ID= " + ID + " Имя рабочего с почасовой оплатой: " + Name + "\n" + "Его ежемесячная зарплата= " + 20.8 * 8 * PayType + "\n");
  26. PayType = 20.8 * 8 * PayType;
  27. }
  28. public override string ToString()
  29. {
  30. return PayType.ToString();
  31. }
  32. }
  33. class StaticPayWorker : Worker
  34. {
  35. public StaticPayWorker(int id, string name, float paytype)
  36. {
  37. ID = id;
  38. Name = name;
  39. PayType = paytype;
  40. }
  41. public override void CalculatePay()
  42. {
  43. Console.WriteLine("ID= " + ID + " Имя рабочего с фиксированной оплатой: " + Name + "\n" + "Его ежемесячная зарплата= " + PayType);
  44. }
  45. }
  46. class Program
  47. {
  48. static double MyComparer(Worker x, Worker y)
  49. {
  50. return x.PayType - y.PayType;
  51. }
  52. static void Main(string[] args)
  53. {
  54. List<Worker> workers = new List<Worker>();
  55. workers.Add(new HourlyPayWorker(43, "Андрей", 80));
  56. workers.Add(new StaticPayWorker(28, "Николай", 15000));
  57. workers.Add(new HourlyPayWorker(01, "Василий", 150));
  58. workers.Add(new StaticPayWorker(152, "Максим", 28000));
  59. workers.Add(new HourlyPayWorker(96, "Игорь", 110));
  60. workers.Add(new HourlyPayWorker(3, "Алексей", 200));
  61. workers.Add(new StaticPayWorker(8769, "Елена", 19000));
  62. workers.Add(new StaticPayWorker(61, "Ирина", 22000));
  63. workers.Add(new StaticPayWorker(82, "Name1", 90000));
  64. workers.Add(new HourlyPayWorker(88, "Name2", 88));
  65. foreach (Worker worker in workers)
  66. worker.CalculatePay();
  67. Console.WriteLine("--------------------------------------------" + "\n" + "--------------------------------------------");
  68. Console.WriteLine("Сортировка по возрастанию");
  69. Console.ReadKey();
Подтер лишнее,что сразу не заметил
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace ShowTest
  7. {
  8. abstract class Worker
  9. {
  10. public int ID { get; set; }
  11. public string Name { get; set; }
  12. public double PayType { get; set; }
  13. public abstract void CalculatePay();
  14. }
  15. class HourlyPayWorker : Worker
  16. {
  17. public HourlyPayWorker(int id, string name, float paytype)
  18. {
  19. ID = id;
  20. Name = name;
  21. PayType = paytype;
  22. }
  23. public override void CalculatePay()
  24. {
  25. Console.WriteLine("ID= " + ID + " Имя рабочего с почасовой оплатой: " + Name + "\n" + "Его ежемесячная зарплата= " + 20.8 * 8 * PayType + "\n");
  26. PayType = 20.8 * 8 * PayType;
  27. }
  28. }
  29. class StaticPayWorker : Worker
  30. {
  31. public StaticPayWorker(int id, string name, float paytype)
  32. {
  33. ID = id;
  34. Name = name;
  35. PayType = paytype;
  36. }
  37. public override void CalculatePay()
  38. {
  39. Console.WriteLine("ID= " + ID + " Имя рабочего с фиксированной оплатой: " + Name + "\n" + "Его ежемесячная зарплата= " + PayType);
  40. }
  41. }
  42. class Program
  43. {
  44. static void Main(string[] args)
  45. {
  46. List<Worker> workers = new List<Worker>();
  47. workers.Add(new HourlyPayWorker(43, "Андрей", 80));
  48. workers.Add(new StaticPayWorker(28, "Николай", 15000));
  49. workers.Add(new HourlyPayWorker(01, "Василий", 150));
  50. workers.Add(new StaticPayWorker(152, "Максим", 28000));
  51. workers.Add(new HourlyPayWorker(96, "Игорь", 110));
  52. workers.Add(new HourlyPayWorker(3, "Алексей", 200));
  53. workers.Add(new StaticPayWorker(8769, "Елена", 19000));
  54. workers.Add(new StaticPayWorker(61, "Ирина", 22000));
  55. workers.Add(new StaticPayWorker(82, "Name1", 90000));
  56. workers.Add(new HourlyPayWorker(88, "Name2", 88));
  57. foreach (Worker worker in workers)
  58. worker.CalculatePay();
  59. Console.WriteLine("--------------------------------------------" + "\n" + "--------------------------------------------");
  60. Console.WriteLine("Сортировка по возрастанию");
  61. Console.ReadKey();

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

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Runtime.Serialization.Formatters.Binary;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace ShowTest
  10. {
  11.     [Serializable]
  12.     internal abstract class Worker : IComparable<Worker>
  13.     {
  14.         public int ID { get; set; }
  15.         public string Name { get; set; }
  16.         public double Salary { get; protected set; }
  17.         public abstract void CalculateSalary();
  18.  
  19.         public Worker(int id, string name)
  20.         {
  21.             ID = id;
  22.             Name = name;
  23.         }
  24.  
  25.         public int CompareTo(Worker other)
  26.         {
  27.             var res = -Salary.CompareTo(other.Salary);
  28.             if (res == 0)
  29.                 res = Name.CompareTo(other.Name);
  30.  
  31.             return res;
  32.         }
  33.  
  34.         public override string ToString()
  35.         {
  36.             return Salary + " " + Name;
  37.         }
  38.     }
  39.  
  40.     [Serializable]
  41.     internal class HourlyPayWorker : Worker
  42.     {
  43.         public double HourlySalary { get; set; }
  44.  
  45.         public HourlyPayWorker(int id, string name, double hourlySalary): base(id, name)
  46.         {
  47.             HourlySalary = hourlySalary;
  48.         }
  49.  
  50.         public override void CalculateSalary()
  51.         {
  52.             Salary = 20.8*8*HourlySalary;
  53.         }
  54.     }
  55.  
  56.     [Serializable]
  57.     internal class StaticPayWorker : Worker
  58.     {
  59.         public StaticPayWorker(int id, string name, double salary) : base(id, name)
  60.         {
  61.             Salary = salary;
  62.         }
  63.  
  64.         public override void CalculateSalary()
  65.         {
  66.         }
  67.     }
  68.  
  69.     internal class Program
  70.     {
  71.         private static void Main(string[] args)
  72.         {
  73.  
  74.             var workers = new List<Worker>();
  75.             workers.Add(new HourlyPayWorker(43, "Андрей", 80));
  76.             workers.Add(new StaticPayWorker(28, "Николай", 15000));
  77.             workers.Add(new HourlyPayWorker(01, "Василий", 150));
  78.             workers.Add(new StaticPayWorker(152, "Максим", 28000));
  79.             workers.Add(new HourlyPayWorker(96, "Игорь", 110));
  80.             workers.Add(new HourlyPayWorker(3, "Алексей", 150));
  81.             workers.Add(new StaticPayWorker(8769, "Елена", 28000));
  82.             workers.Add(new StaticPayWorker(61, "Ирина", 22000));
  83.             workers.Add(new StaticPayWorker(82, "Name1", 90000));
  84.             workers.Add(new HourlyPayWorker(88, "Name2", 150));
  85.             foreach (Worker worker in workers)
  86.                 worker.CalculateSalary();
  87.  
  88.             Console.WriteLine("--------------------------------------------");
  89.             Console.WriteLine("Запись в файл ...");
  90.             using (var fs = new FileStream("C:\\temp.bin", FileMode.Create))
  91.                 new BinaryFormatter().Serialize(fs, workers);
  92.  
  93.             Console.WriteLine("--------------------------------------------");
  94.             Console.WriteLine("Чтение из файла ...");
  95.             using (var fs = new FileStream("C:\\temp.bin", FileMode.Open))
  96.             try
  97.             {
  98.                 workers = (List<Worker>) new BinaryFormatter().Deserialize(fs);
  99.             }catch(Exception ex)
  100.             {
  101.                 Console.WriteLine("Incorrect file format or file does not exist");
  102.                 Console.ReadLine();
  103.                 return;
  104.             }
  105.  
  106.             Console.WriteLine("--------------------------------------------");
  107.             Console.WriteLine("Сортировка по возрастанию:");
  108.  
  109.             workers.Sort();
  110.  
  111.             foreach (Worker worker in workers)
  112.                 Console.WriteLine(worker);
  113.  
  114.             Console.ReadKey();
  115.         }
  116.     }
  117. }

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


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

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

9   голосов , оценка 3.778 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы