
C#을 사용하다 보면 컬렉션을 사용하는 경우가 되게 많지만 때때로는 그냥 배열을 사용하는 경우도 생깁니다.
특히 저는 배열을 더 좋아하는 편이기도 합니다.
배열을 사용할 때 정렬이 필요한 경우에는 크게 2가지를 사용합니다.
- Array Class의 Sort
- LINQ
여기서 Array Class의 Sort 기능은 실제 배열의 순서를 뒤바꾸게 되고
LINQ를 사용하는 경우에는 실제 배열의 순서를 바꾸지는 않습니다.
이번 시간에는 Array Class의 Sort를 사용하는 방법을 알아봅시다.
Array Class의 Sort 사용하기
먼저 Sort를 사용한 예제를 보고 사용법을 알아봅시다.
internal class Program
{
private static void PrintArr<T>(T[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i]);
if (i == arr.Length - 1)
Console.WriteLine();
else
Console.Write(", ");
}
}
static void Main(string[] args)
{
int[] arrNumber = { 10, 8, 2, 11, 7 };
PrintArr(arrNumber);
Array.Sort(arrNumber);
PrintArr(arrNumber);
}
}
위의 코드를 실행시키면

위와 같은 결과를 도출합니다.
위의 코드에서 중요한 부분은 바로 Main 함수의 Array.Sort(배열) 부분입니다.
Sort를 하기 전에는 원래의 배열을 출력하고, Sort를 한 후에는 오름차순으로 출력을 했습니다.
일단 사용법을 알기 전에 위의 예제를 통해서 도출할 수 있는 내용은
- Sort는 오름차순 정렬이 기본값이다.
- Sort를 사용하기 위해서는 Array.Sort로 사용한다.
이제 사용법을 알아봅시다.

일단 Array.Sort는 상당히 많은 오버로드 함수를 가지고 있습니다.
저 중에서도 가장 많이 쓰이는 2가지를 알아보겠습니다.
// 요약 : Sorts the elements in an entire System.Array using the System.IComparable`1 generic interface implementation of each element of the System.Array.
// 매개변수 : array - The one-dimensional, zero-based System.Array to sort.
// 예외 : System.ArgumentNullException, System.InvalidOperationException
public static void Sort<T>(T[] array)
첫 번째는 위의 예제에서 나온 Sort 함수입니다.
1차원 Generic Interface를 상속한 배열(IComparable)을 정렬해줍니다.
// 요약 : Sorts the elements in an System.Array using the specified System.Comparison`1.
// 매개변수 : array - The one-dimensional, zero-based System.Array to sort.
// : comparison - The System.Comparison`1 to use when comparing elements.
// 예외 : System.ArgumentNullException, System.ArgumentException
public static void Sort<T>(T[] array, Comparison<T> comparison)
두 번째는 사용자 비교를 넣은 Sort 함수입니다.
자기가 원하는 Sort 방식으로 동작하도록 유도하게 됩니다.
두 번째 방식을 사용하여 위의 예제를 내림차순으로 바꾸어봅시다.
static void Main(string[] args)
{
int[] arrNumber = { 10, 8, 2, 11, 7 };
PrintArr(arrNumber);
// 오름차순
Array.Sort(arrNumber);
PrintArr(arrNumber);
// 내림차순
Array.Sort(arrNumber, (num1, num2) => num2.CompareTo(num1));
PrintArr(arrNumber);
}
람다식이 들어간 Sort 함수가 생겼습니다.
일단 여기서 CompareTo 함수의 반환값에 대해서 살펴보아야합니다.
// 반환 값:
// A signed number indicating the relative values of this instance and value.
// Return Value – Description
// Less than zero – This instance is less than value.
// Zero – This instance is equal to value.
// Greater than zero – This instance is greater than value.
쉽게 설명하자면
A.CompareTo(B);
ㄴ A가 B보다 작으면 음수 (-1)
ㄴ A와 B가 같으면 0
ㄴ A가 B보다 크면 양수 (1)
이렇게 값이 반환됩니다.
오름차순 Sort와 내림차순 Sort를 각각 비교해봅시다.
// 오름차순
Array.Sort(arrNumber, (num1, num2) => num1.CompareTo(num2));
Array.Sort(arrNumber, (num1, num2) => num1 > num2 ? 1 : -1); // 위의 함수와 같은 기능
// 내림차순
Array.Sort(arrNumber, (num1, num2) => num2.CompareTo(num1));
Array.Sort(arrNumber, (num1, num2) => num1 > num2 ? -1 : 1); // 위의 함수와 같은 기능
여기서 알 수 있는 점은 람다식이 1을 도출하면 오름차, -1을 도출하면 내림차가 된다는 사실입니다.
(num2.CompareTo(num1)의 경우에는 num1과 num2가 바뀌어서 실제적으로 돌아가는 것은 -1로 돌아가는 로직과 같아집니다.)
그렇다면 int, double과 같은 타입이 아닌 class 타입의 경우에는 어떻게 사용해야 할까요?
class의 Array Class Sort 기능 사용하기
class에서 Sort 기능을 이용하여 내가 원하는 대로 Sort를 하기 위해서는 IComparable 인터페이스를 상속하여 CompareTo 함수를 정의해주어야 합니다.

이것을 이용하여 작성한 예제입니다.
class Human : IComparable
{
public string Name { get; set; } = string.Empty;
public int Age { get; set; } = 0;
public Human(string strName = "", int nAge = 0)
{
Name = strName;
Age = nAge;
}
// IComparable을 상속하면 무조건 구현해주어야 하는 함수입니다.
// 나이을 기준으로 오름차순 정렬하는 함수입니다.
public int CompareTo(object obj)
{
// 비교 대상의 Age보다 크면 1을 반환
if (Age > (obj as Human).Age)
return 1;
// 비교 대상의 Age와 같으면 0을 반환
else if (Age == (obj as Human).Age)
return 0;
// 비교 대상의 Age보다 작으면 -1을 반환
else
return -1;
}
public override string ToString()
{
return $"{Name} : {Age}";
}
}
먼저 예제에서 사용할 Human Class 입니다.
해당 Class는 Name 속성과 Age 속성을 가지고 있습니다.
그리고 IComparable을 상속하여 CompareTo 함수를 정의합니다.
이제 이 Class를 Sort하여 봅시다.
// 배열 출력 함수
private static void PrintArr<T>(T[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
Console.WriteLine();
}
static void Main(string[] args)
{
Human[] arrHuman = new Human[]
{
new Human("홍길동", 55),
new Human("김민수", 19),
new Human("이철수", 44),
new Human("누구지", 24)
};
PrintArr(arrHuman);
Array.Sort(arrHuman);
PrintArr(arrHuman);
}
출력 결과는 다음과 같습니다.

'Study > C#, Winform' 카테고리의 다른 글
| [C#] 바이트 배열을 이용한 비트 다루기 : BitArray (2) | 2023.07.15 |
|---|---|
| [C# Winform] PropertyGrid 에서 DisplayName 우선순위 (0) | 2022.12.26 |
| [C# Winform] DataGridView Column Header Drag (컬럼 헤더 드래그) (0) | 2022.10.24 |
| [C#] DateTime 시간 자르기, 반올림, 반내림, 가까운 값 (1) | 2022.10.11 |
| [C#] Enumerable 에서 중복 데이터 삭제 (Distinct) (0) | 2022.10.06 |