모름

delegate int Compare<T>(T a, T b);

class Program {
    static int AscendCompare<T>(T a, T b) where T : IComparable<T> {
        return a.CompareTo(b);
    }

    static int DescendCompare<T>(T a, T b) where T : IComparable<T> {
        return a.CompareTo(b) * -1; //내림차순으로 바꿔줍니다
    }

    static void BubbleSort<T>(T[] DataSet, Compare<T> Comparer) {
        int i = 0;
        int j = 0;
        T temp;

        for (i = 0; i < DataSet.Length - 1; i++) {
            for (j = 0; j < DataSet.Length - (i + 1); j++) {
                if(Comparer(DataSet[j], DataSet[j+1]) > 0) {
                    temp = DataSet[j + 1];
                    DataSet[j + 1] = DataSet[j];
                    DataSet[j] = temp;
                }
            }
        }
    }

    static void Main(string[] args) {
        int[] arr = { 3, 7, 4, 2, 10 };

        Console.WriteLine("Sorting ascending...");
        BubbleSort(arr, new Compare<int>(AscendCompare));

        foreach (var item in arr) {
            Console.WriteLine(item);
        }

        string[] strArr = { "abc", "def", "ghi", "jkl", "mno" };

        Console.WriteLine("Sorting descending...");
        BubbleSort(strArr, new Compare<string>(DescendCompare));

        foreach (var item in strArr) {
            Console.WriteLine(item);
        }
    }
}

 

여기서 아마 처음보는 부분은 IComparable<> 인터페이스일겁니다. 이 인터페이스는 System.Int32(int), Sytem.Double(double) 등과 같은 모든 수치 형식과 System.String(string)은 모두 위 인터페이스를 상속합니다. 그리고 그 안에서 CompareTo() 메소드를 내부적으로 구현하고 있습니다. CompareTo()는 자신보다 크면 -1, 같으면 0, 작으면 1을 반환합니다. 그럼 이제 앞선 예제코드를 이해할수 있습니다.