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 (0) | 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 |