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을 반환합니다. 그럼 이제 앞선 예제코드를 이해할수 있습니다.