유니티

유니티 C# OrderBy와 ThenBy

bugmin 2024. 4. 15. 13:01
using System.Linq;

 

시스템의 Linq를 사용했을 때 쓸 수 있는 기능

 

int[] arr = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
arr = arr.OrderBy(x => Random.Range(0f, 7f)).ToArray();

 

만일 위와 같이 배열을 선언하고 OrderBy를 통해 정렬하면 어떻게 정렬이 되는가

 

위의 코드는 짝맞추기 게임에 활용되는 코드라 0,0 1,1 2,2 이렇게 배열에 짝을 맞추는 숫자가 있는 것인데

 

좀 더 쉬운 예시를 들면

int[] arr = { 0, 1, 2 };
arr = arr.OrderBy(x => Random.Range(0f, 3f)).ToArray();

 

위와 같이 있다해보자

 

OrderBy는 시퀀스의 요소를 오름차순으로 정렬한다는 의미로 OrderByDescending이라는 내림차순 기능도 있다.

 

위의 코드에선 그 키를 랜덤하게 정해주겠다는 것이다.

Random.Range(0f, 3f)는 0이상 3미만의 float 값을 랜덤하게 만들어주고

 

그 랜덤한 값을 arr[0], arr[1], arr[2] 에 각각 키를 부여해준다.

 

arr[0]: 1.2

arr[1]: 2.4

arr[2]: 1.7

 

예를 들어 위와 같이 키값이 부여됐다면 이 키 값을 바탕으로 오름차순 정렬을 하는 것이다.

 

키 값의 순서에 따라 arr[0], arr[2], arr[1] 의 값 순으로 정렬이 될 것이다.

즉 0, 2, 1 값으로 정렬이되고

 

ToArray()는 이 정렬된 것을 배열로 만든다는 의미고 배열로 만든 다음에 정수 배열인 arr에 넣어주었다.

 

만일 추가적으로 더 정렬을 하고 싶다 그러면 ThenBy를 이용해주면 된다.

 

마이크로소프트 문서 https://learn.microsoft.com/ko-kr/dotnet/api/system.linq.enumerable.thenby?view=net-8.0

에서 가져온 예시를 들면 

 

Enumerable.ThenBy 메서드 (System.Linq)

시퀀스의 요소를 오름차순으로 다시 정렬합니다.

learn.microsoft.com

string[] fruits = { "grape", "passionfruit", "banana", "mango",
                      "orange", "raspberry", "apple", "blueberry" };
                      
fruits = fruits.OrderBy(fruit => fruit.Length).ThenBy(fruit => fruit).ToArray();

 

fruits 배열을 OrderBy로 먼저 키 값을 fruit.Length(글자 수)를 기준으로 오름차순 정렬을 한다.

 

먼저 OrderBy로만 정렬을 하게 되면 결과는

 

grape - mango - apple - banana - orange - raspberry - blueberry - passionfruit

 

순으로 글자 수에 따라 오름차순으로 정렬이 되는데

 

여기서 ThenBy로 한 번더 정렬을 해줄 수 있다. 요소 자체의 값으로 정렬을 하고 싶으면 x => x 와 같은 형태로 키를 설정하면 된다.

즉 fruit => fruit 도 요소 자체의 값으로 정렬을 한다는 것이고

 

string에서 요소 자체의 값으로 정렬한다는 것은 사전 순서대로 비교하여 정렬한다는 것이다.

 

만일 abc랑 apcd가 있다면 첫 문자는 같지만 두 번째 문자의 순서가 b가 더 빠르다. 

고로 abc가 apcd보단 앞에 위치하게 된다. (오름차순 기준)

 

고로 OrderBy로 글자 수로 정렬 후에 ThenBy로 사전 순(자체 요소)으로 정렬 해주면

 

apple - grape - mango - banana - orange - blueberry - raspberry -passionfruit

 

의 결과를 얻을 수 있다.

 

 

 

 

 

'유니티' 카테고리의 다른 글

유니티 - 애니메이션  (0) 2024.05.24
유니티 아크탄젠트(Atan2)에 대하여  (0) 2024.05.13
유니티 PlayerPrefs  (0) 2024.04.18
유니티 UI의 Rect Transform  (0) 2024.04.17
유니티 캔버스(Canvas)와 Render Mode  (0) 2024.04.16