[C#] Collection Class : List (Sort, IComparer, BinarySearch(), FindAll()PROGRAMMING/03. C#2024. 4. 17. 12:11
Table of Contents
반응형
Collection Class
: Collection으로 부터 상속받은 애들
⚠️ using System.Collections; / using System.Collections.Generic; 를 써줘야 동작한다⚠️
List Collection
Sort() : 정렬
: 배열을 정렬해주는 함수 - int 타입➡ 오름차순, string(또는 char) 타입 ➡ 알파벳순
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
List<string> list = new List<string>()
{
"Unreal",
"Unity",
"Lumberyard",
"Houndini",
"Box2D",
"PhyX",
"FMOD",
"SpeedTree"
};
list.Sort(); // 정렬
Print(list);
|
cs |
⬇️출력하는 부분 함수⬇️
1
2
3
4
5
6
7
8
9
10
|
private void Print<T>(IEnumerable<T> items)
{
int index = 0;
IEnumerator<T> enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
{
print($"{++index} : {enumerator.Current}");
}
}
|
cs |
IComparer
C#의 커스텀 클래스는 기본적으로 객체의 수 많은 정보들 중에서 무엇을 기준으로 해야 할지 모르기 때문에 비교 불가능이다. 따라서 내가 원하는 자료형 배열로 Sort() 하고 싶을 때 사용하는 비교 정렬을 위한 인터페이스이다.
⬇️ IComparer 없이 Sort() 했을 때 ⬇️
1
2
3
4
5
6
7
8
9
|
List<User> users = new List<User>()
{
new User(3, "Oak", 100),
new User(2, "Goblin", 150),
new User(6, "Wisp", 80),
new User(1, "Slime", 160),
};
users.Sort();
|
cs |
그냥 하면 이렇게 예외가 뜨는 걸 볼 수 있다. 기준이 없기 때문에 정렬을 할 수 없다는 예외가 발생한다.
⬇️ IComparer 사용 ⬇️
- 객체를 비교 가능하게 만들기 위해 UserCompare(새로운 클래스) : IComparer<User> 으로 생성
- Sort() 안에 새로운 클래스 동적 생성 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
private class UserCompare : IComparer<User>
{
public int Compare(User x, User y) // 왼쪽이 크면 -1, 오른쪽이 크면 1
{
if (Object.ReferenceEquals(x, y))
return 0;
if (x == null)
return 1;
if (y == null)
return -1;
int result = x.Id < y.Id ? -1 : 1; //만약 Id기준으로 정렬을 하고싶다면
if (x.Id == y.Id) result = 0;
return result;
}
}
|
cs |
1
2
|
users.Sort(new UserCompare()); // 추가
Print(users);
|
cs |
BinarySearch()
이진탐색 : 정렬된 배열에서
- 특정 값(value)을 찾을 때
- 있는지 없는지 확인할 수도 있지만 무엇인가를 끼워넣을 때도 쓴다
1
2
3
4
|
users.Sort(new UserCompare());
int index = users.BinarySearch(new User(2), new UserCompare());
users.Insert(index, new User(5, "Dwarf", 200));
|
cs |
FindAll()
특정 조건에 일치하는 요소(값)를 반환
- .Find() : 첫 번째 요소를 반환
- .FindAll() : 메서드 모든 요소를 반환
- .FindLast() : 메서드 마지막 요소를 반환
⚠️delegate라 람다식이 가능하다⚠️
1
2
|
List<User> finds = users.FindAll(value => value.Id % 2 == 0); // 짝수 Id인 요소만 가져오는 코드
Print(finds);
|
cs |
출처 및 참고: 강의 짱잘하시는 울 유니티 선생님 수업
반응형
@HYUNJZZANG :: HyunZzang
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)