Сортировка по нескольким полям - 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();
}
}
}