Сортировка массива по одному из полей внутренних обьектов - C#
Формулировка задачи:
Классы:
Есть массив:
Нужно отсортировать по убыванию Salary, и, если имена совпадают, сортировать их по алфавиту. Уверен, что можна через Array.Sort() отсортировать, но голову сломи не могу додуматся. Не представляю как сделать(
P.S. есть еще маленький баг. Все елементы должны иметь уникальные Id, но у меня не выходит наладить их.
Но видимо он неправильно написан
abstract class Worker { public Worker(string Name) { Id = ++Id; this.Name = Name; } public static uint Id { get; set; } public string Name { get; set; } public abstract double Salary { get; } public override string ToString() { return $"Worker #{Id}. Name: {Name}. Salary: {Salary}"; } } class FixedWorker: Worker { public FixedWorker(string Name) :base(Name) { } public FixedWorker(string Name, double HourlyRate) :base(Name) { this.HourlyRate = HourlyRate; } public double HourlyRate { get; set; } = 90; public override double Salary { get { return 20.8 * 8 * HourlyRate; } } } class HourlyWorker : Worker { public HourlyWorker(string Name) : base(Name) { } public HourlyWorker(string Name, double MonthlyRate) : base(Name) { this.MonthlyRate = MonthlyRate; } public double MonthlyRate { get; set; } = 10900; public override double Salary { get { return MonthlyRate; } } }
Worker[] workers = new Worker[] { new FixedWorker("Mikkey"), new FixedWorker("John", 87), new FixedWorker("Mak", 45), new FixedWorker("Sergiy", 50), new FixedWorker("Vitaly", 2), new HourlyWorker("Maki", 2000), new HourlyWorker("Andriy", 2300), new HourlyWorker("Batia", 9999), new HourlyWorker("Ievdokum", 1500), new HourlyWorker("Iaropolk", 1000), };
Нашёл вот такой код:
Array.Sort(workers, (p1, p2) => p1.Salary < p2.Salary));
Решение задачи: «Сортировка массива по одному из полей внутренних обьектов»
textual
Листинг программы
using System; using System.Linq; using System.Threading; namespace hard { class Program { static void Main(string[] args) { Worker[] workers = new Worker[] { new FixedWorker("Mikkey"), new FixedWorker("John", 87), new FixedWorker("Mak", 45), new FixedWorker("Sergiy", 50), new FixedWorker("Vitaly", 2), new HourlyWorker("Maki", 2000), new HourlyWorker("Andriy", 2300), new HourlyWorker("Batia", 9999), new HourlyWorker("Ievdokum", 1500), new HourlyWorker("Iaropolk", 1000), }; // linq expression //This is a short working code, but if the array is large, it is not very efficient (in performance term), because the array is converted to list first, then sorted, and finally converted to array workers = workers.OrderByDescending(a => a.Salary).ThenBy(b => b.Name).ToArray(); //Array.Sort(workers); //Array.Reverse(workers); foreach (var worker in workers) { Console.WriteLine(worker.ToString()); } Console.WriteLine(Environment.NewLine + "First 5 names: "); for(int i = 0; i < 5; i++) { Console.WriteLine($"#{i+1}: {workers[i].Name}"); } Console.ReadKey(); } } abstract class Worker :IComparable<Worker> { protected static int LastId; public Worker(string Name) { Id = Interlocked.Increment(ref LastId); this.Name = Name; } public int Id { get; set; } public string Name { get; set; } public abstract double Salary { get; } public override string ToString() { return $"Worker #{Id}. Name: {Name}. Salary: {Salary}"; } public int CompareTo(Worker other) { int result = Salary.CompareTo(other.Salary); return result != 0 ? result : Name.CompareTo(other.Name); } } class FixedWorker: Worker { public FixedWorker(string Name) :base(Name) { } public FixedWorker(string Name, double HourlyRate) :base(Name) { this.HourlyRate = HourlyRate; } public double HourlyRate { get; set; } = 90; public override double Salary { get { return 20.8 * 8 * HourlyRate; } } } class HourlyWorker : Worker { public HourlyWorker(string Name) : base(Name) { } public HourlyWorker(string Name, double MonthlyRate) : base(Name) { this.MonthlyRate = MonthlyRate; } public double MonthlyRate { get; set; } = 10900; public override double Salary { get { return MonthlyRate; } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д