Сортировка массива по одному из полей внутренних обьектов - C#

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

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

Классы:
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),
            };
Нужно отсортировать по убыванию Salary, и, если имена совпадают, сортировать их по алфавиту. Уверен, что можна через Array.Sort() отсортировать, но голову сломи не могу додуматся. Не представляю как сделать( P.S. есть еще маленький баг. Все елементы должны иметь уникальные Id, но у меня не выходит наладить их.
Нашёл вот такой код:
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; } }
    }
}

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


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

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

14   голосов , оценка 3.643 из 5
Похожие ответы