본문 바로가기

.NET/C# Basic

C# Custom Sort Null 널값이 제일 아래로 IComparer IComparable

반응형

IComparable 및 IComparer 인터페이스 Visual C#에서 사용 하는 방법




static void Main(string[] args)

        {

            // Create an arary of car objects.      

            car[] arrayOfCars = new car[8]         {

                        new car("Ford",1992),

                        new car("Fiat",1988),

                        new car("Buick",1932),

                        new car("Ford",1932),

                        new car("Dodge",1999),

                        new car(string.Empty,1990 ),

                        new car("sexy",null ),

                        new car("Honda",1977)

                     };


            // Write out a header for the output.

            Console.WriteLine("Array - Unsorted\n");


            foreach (car c in arrayOfCars)

                Console.WriteLine(c.Make + "\t\t" + c.Year);


            // Demo IComparable by sorting array with "default" sort order.

            Array.Sort(arrayOfCars);

            Console.WriteLine("\nArray - Sorted by Make (Ascending - IComparable)\n");


            //Array.Sort(arrayOfCars, car.sortMakeAscending());

            //Console.WriteLine("\nArray - Sorted by Make (Ascending - IComparable)\n");


            foreach (car c in arrayOfCars)

                Console.WriteLine(c.Make + "\t\t" + c.Year);


            // Demo descending sort of string value with IComparer.

            Array.Sort(arrayOfCars, car.sortMakeDescending());

            Console.WriteLine("\nArray - Sorted by Make (Descending - IComparer)\n");


            foreach (car c in arrayOfCars)

                Console.WriteLine(c.Make + "\t\t" + c.Year);


            // Demo ascending sort of numeric value with IComparer.

            Array.Sort(arrayOfCars, car.sortYearAscending());

            Console.WriteLine("\nArray - Sorted by Year (Ascending - IComparer)\n");


            foreach (car c in arrayOfCars)

                Console.WriteLine(c.Make + "\t\t" + c.Year);


            // Demo descending sort of numeric value using IComparer.

            Array.Sort(arrayOfCars, car.sortYearDescending());

            Console.WriteLine("\nArray - Sorted by Year (Descending - IComparer)\n");


            foreach (car c in arrayOfCars)

                Console.WriteLine(c.Make + "\t\t" + c.Year);



            // Demo ascending sort of numeric value with IComparer.

            Array.Sort(arrayOfCars, car.sortNullYearAscending());

            Console.WriteLine("\nArray - Sorted by Year (NullAscending - IComparer)\n");


            foreach (car c in arrayOfCars)

                Console.WriteLine(c.Make + "\t\t" + c.Year);


            // Demo descending sort of numeric value using IComparer.

            Array.Sort(arrayOfCars, car.sortNullYearDescending());

            Console.WriteLine("\nArray - Sorted by Year (NullDescending - IComparer)\n");


            foreach (car c in arrayOfCars)

                Console.WriteLine(c.Make + "\t\t" + c.Year);



            Console.ReadLine();

        }


        public class car : IComparable

        {

            // Beginning of nested classes.


            // Nested class to do ascending sort on year property.

            private class sortYearAscendingHelper : IComparer

            {

                int IComparer.Compare(object a, object b)

                {

                    car c1 = (car)a;

                    car c2 = (car)b;



                    if (c1.year > c2.year)

                        return 1;



                    if (c1.year < c2.year)

                        return -1;


                    else

                        return 0;


                }

            }


            // Nested class to do descending sort on year property.

            private class sortYearDescendingHelper : IComparer

            {

                int IComparer.Compare(object a, object b)

                {

                    car c1 = (car)a;

                    car c2 = (car)b;




                    if (c1.year < c2.year)

                        return 1;


                    if (c1.year > c2.year)

                        return -1;


                    else

                        return 0;

                }

            }




            private class sortNullYearAscendingHelper : IComparer

            {

                int IComparer.Compare(object a, object b)

                {

                    car c1 = (car)a;

                    car c2 = (car)b;



                    if (c1.year == null && c2.year == null)

                        return 0;

                    if (c1.year != null && c2.year == null)

                        return -1;

                    if (c2.year != null && c1.year == null)

                        return 1;



                    if (c1.year > c2.year)

                        return 1;



                    if (c1.year < c2.year)

                        return -1;


                    else

                        return 0;


                }

            }


            // Nested class to do descending sort on year property.

            private class sortNullYearDescendingHelper : IComparer

            {

                int IComparer.Compare(object a, object b)

                {

                    car c1 = (car)a;

                    car c2 = (car)b;


                    //if (string.IsNullOrEmpty(Convert.ToString(c1.year)) || string.IsNullOrEmpty(Convert.ToString(c2.year)))

                    //    return -1;


                    if (c1.year == null && c2.year == null)

                        return 0;

                    if (c1.year != null && c2.year == null)

                        return -1;

                    if (c2.year != null && c1.year == null)

                        return 1;


                    if (c1.year < c2.year)

                        return 1;


                    if (c1.year > c2.year)

                        return -1;


                    else

                        return 0;

                }

            }





            // Nested class to do descending sort on make property.

            private class sortMakeDescendingHelper : IComparer

            {

                int IComparer.Compare(object a, object b)

                {

                    car c1 = (car)a;

                    car c2 = (car)b;

                    return String.Compare(c2.make, c1.make);

                }

            }



            // End of nested classes.


            private int? year;

            private string make;


            public car(string Make, int? Year)

            {

                make = Make;

                year = Year;

            }


            public int? Year

            {

                get { return year; }

                set { year = value; }

            }


            public string Make

            {

                get { return make; }

                set { make = value; }

            }


            // Implement IComparable CompareTo to provide default sort order.

            int IComparable.CompareTo(object obj)

            {

                car c = (car)obj;

                return String.Compare(this.make, c.make);

            }


            // Method to return IComparer object for sort helper.

            public static IComparer sortYearAscending()

            {

                return (IComparer)new sortYearAscendingHelper();

            }


            // Method to return IComparer object for sort helper.

            public static IComparer sortYearDescending()

            {

                return (IComparer)new sortYearDescendingHelper();

            }


            public static IComparer sortNullYearAscending()

            {

                return (IComparer)new sortNullYearAscendingHelper();

            }


            // Method to return IComparer object for sort helper.

            public static IComparer sortNullYearDescending()

            {

                return (IComparer)new sortNullYearDescendingHelper();

            }



            // Method to return IComparer object for sort helper.

            public static IComparer sortMakeDescending()

            {

                return (IComparer)new sortMakeDescendingHelper();

            }



            //public static IComparer sortMakeAscending()

            //{

            //    return (IComparer)new sortMakeAscendingHelper();

            //}




        }



ConsoleApplication1.zip