static void Main()
        {
            Random rand = new Random();
            Student[] students = new Student[10];
            string[] firstNames = new string[] { "Niki", "Doncho", "Pesho", "Maria", "Stamat", "Ivan", "Ivo", "Gosho", "Evlogi", "Svetlin" };
            string[] lastNames = new string[] { "Kostov", "Minkov", "Peshev", "Ivanov", "Stamatov", "Popov", "Kenov", "Goshev", "Hristov", "Nakov" };

            for (int i = 0; i < students.Length; i++)
            {
                string firstName = firstNames[rand.Next(0, 10)];
                string lastName = lastNames[rand.Next(0, 10)];
                uint grade = (uint)rand.Next(1, 5);
                Student student = new Student(firstName, lastName, grade);
                students[i] = student;
            }

            Console.WriteLine("STUDENTS");
            var studentsByGrade = students.OrderBy(st => st.Grade).ToList();
            foreach (var student in studentsByGrade)
            {
                Console.WriteLine("{0} {1}, grade --> {2}", student.FirstName, student.LastName, student.Grade);
            }

            Worker[] workers = new Worker[10];
            for (int i = 0; i < workers.Length; i++)
            {
                string firstName = firstNames[rand.Next(0, 10)];
                string lastName = lastNames[rand.Next(0, 10)];
                decimal weekSalary = (decimal)rand.Next(100, 200);
                Worker worker = new Worker(firstName, lastName, weekSalary, 8);
                workers[i] = worker;
            }

            Console.WriteLine("WORKERS");
            var workersByHourMoney = workers.OrderByDescending(w => w.MoneyPerHour()).ToList();
            foreach (var worker in workersByHourMoney)
            {
                Console.WriteLine("{0} {1} --> {2} money per hour", worker.FirstName, worker.LastName, worker.MoneyPerHour());
            }

            var mergedList = students.Union<Human>(workers).OrderBy(h => h.FirstName).ThenBy(h => h.LastName);
            Console.WriteLine("HUMANS LIST");
            foreach (var human in mergedList)
            {
                string type = human.GetType().Name;
                Console.WriteLine("{0} {1} type --> {2}", human.FirstName, human.LastName, type);
            }
        }
        static void Main()
        {
            Student[] students = new Student[]
            {
                new Student("Ivan", "Petrov", 5.50),
                new Student("Alex", "Simeonov", 2.75),
                new Student("Iskra", "Radeva", 5.84),
                new Student("Dani", "Kostov", 6.00),
                new Student("Dimo", "Dimov", 2.25),
                new Student("Silviya", "Eneva", 4.33),
                new Student("Oleg", "Harizanov", 3.44),
                new Student("Nikolay", "Tzonkov", 2.87),
                new Student("Viki", "Nikolova", 4.92),
                new Student("Yanko", "Yankov", 5.12)
            };

            Worker[] workers = new Worker[]
               {
               new Worker("Bistra", "Pavlova", 258.25m, 10),
               new Worker("Veni", "Tasheva", 1020.80m, 8),
               new Worker("Daniel", "Elenov", 140.65m, 6),
               new Worker("Angel", "Angelov", 940.48m, 7),
               new Worker("Jivko", "Denchev", 680.58m, 9),
               new Worker("Rosi", "Yankova", 240m, 14),
               new Worker("Rumen", "Zaimov", 315.68m, 18),
               new Worker("Georgi", "Borukov", 110.80m, 2),
               new Worker("Oleg", "Pavlov", 500m, 5),
               new Worker("Vanya", "Vencheva", 190.38m, 12),
               };

            //sorting students by marks ascending using LINQ
            var sortStudents = from st in students
                               orderby st.Grade
                               select st;

            foreach (var st in sortStudents)
            {
                Console.WriteLine(st);
            }

            Console.WriteLine();

            //the same using extension methods
            var sortedStud = students.OrderBy(st => st.Grade);

            foreach (var st in sortedStud)
            {
                Console.WriteLine(st);
            }

            Console.WriteLine();
            //sorting workers by money per hour in descending order
            var sortWorkers = from wks in workers
                              orderby wks.MoneyPerHour() descending
                              select wks;

            foreach (var wrk in sortWorkers)
            {
                Console.WriteLine(wrk);
            }

            Console.WriteLine();
            //the same task using extension methods
            var sortedWorkers = workers.OrderByDescending(wrk => wrk.MoneyPerHour());

            foreach (var worker in sortedWorkers)
            {
                Console.WriteLine(worker);
            }

            Console.WriteLine();
            //merging the lists and sorting them by first name and last name
            var merged = students.Concat<Human>(workers).OrderBy(hm => hm.FirstName).ThenBy(hm => hm.LastName);

            foreach (var human in merged)
            {
                Console.WriteLine(human.FirstName +" "+ human.LastName);
            }
        }