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
에서 가져온 예시를 들면
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 |