/*
         * 1. One of the overload of the sort() method in list class expects Comparision delegate to be passes as an argument.
         *
         * 2. Approach 1.
         *      Step 1: Create a fnction whose signature mathches the signature of System.Comparison delegate.
         *          Comparison() is the method we need to write logic to compare 2 customer objects.
         *      Step 2: Create an instance of System.Comparision delegate and then pass the name of the function created in Step 1 as the argument.
         *          So, at this point "Comparison" delegate is pointing to our function that contains the logic to compare 2 customer objects.
         *      Step 3: Pass the delegate instance as an argument, to Sort() function.
         *
         * 3. Approach 2.
         *      All the steps in approach 1 can be replaced by simply writing delegate keyword and logic in Sort() function.
         *
         * 4. Approach 3.
         *      By using lamda expression.
         */
        static void Main(string[] args)
        {
            Customer customer1 = new Customer() { ID = 101, Name = "Anand Dev", Salary = 4000 };
            Customer customer2 = new Customer() { ID = 102, Name = "Nanhi", Salary = 8000 };
            Customer customer3 = new Customer() { ID = 103, Name = "Praveen", Salary = 6000 };

            List<Customer> listCustomers = new List<Customer>();
            listCustomers.Add(customer1);
            listCustomers.Add(customer3);
            listCustomers.Add(customer2);

            Console.WriteLine("Before sorting.");
            foreach (Customer c in listCustomers)
            {
                Console.WriteLine("ID = {0}, Name = {1}.", c.ID, c.Name);
            }

            #region 1. Approach 1 - Step 2 and 3.
            // Step 2.
            Comparison<Customer> customerComparer = new Comparison<Customer>(Comparison);

            // Step 3.
            listCustomers.Sort(customerComparer);

            Console.WriteLine("\nAfter sorting by ID ASC using Comparison delegate - Approach 1");
            foreach (Customer c in listCustomers)
            {
                Console.WriteLine("ID = {0}, Name = {1}.", c.ID, c.Name);
            }
            #endregion

            #region 2. Approach 2 - By implemention delegate directly in Sort() function.

            Customer customer4 = new Customer() { ID = 104, Name = "Jam", Salary = 4000 };
            Customer customer5 = new Customer() { ID = 105, Name = "Mark", Salary = 8000 };
            Customer customer6 = new Customer() { ID = 106, Name = "Odi", Salary = 6000 };

            List<Customer> listCustomers2 = new List<Customer>();
            listCustomers2.Add(customer6);
            listCustomers2.Add(customer4);
            listCustomers2.Add(customer5);

            Console.WriteLine("\nBefore sorting.");
            foreach (Customer c in listCustomers2)
            {
                Console.WriteLine("ID = {0}, Name = {1}.", c.ID, c.Name);
            }

            Console.WriteLine("Second way.");
            listCustomers2.Sort(delegate(Customer c1, Customer c2) { return c1.ID.CompareTo(c2.ID); });
            Console.WriteLine("\nAfter sorting by ID ASC using Comparison delegate - Approach 2");
            foreach (Customer c in listCustomers2)
            {
                Console.WriteLine("ID = {0}, Name = {1}.", c.ID, c.Name);
            }
            #endregion

            #region 3. Approach 3 - By using lamda expression.
            List<Customer> listAllCustomers = new List<Customer>();
            listAllCustomers.AddRange(listCustomers);
            listAllCustomers.AddRange(listCustomers2);

            Console.WriteLine("\nBefore sorting.");
            foreach (Customer c in listAllCustomers)
            {
                Console.WriteLine("ID = {0}, Name = {1}.", c.ID, c.Name);
            }

            listAllCustomers.Sort((x, y) => x.ID.CompareTo(y.ID));

            Console.WriteLine("\nAfter sorting using lamda expression - Approach 3.");
            foreach (Customer c in listAllCustomers)
            {
                Console.WriteLine("ID = {0}, Name = {1}.", c.ID, c.Name);
            }
            #endregion

            Console.ReadKey();
        }
 // Step 1.
 private static int Comparison(Customer x, Customer y)
 {
     return x.ID.CompareTo(y.ID);
 }