데이터가 많아지면 꼴도 보기 싫다. 특히 내가 원하는 데이터를 찾아야 할 땐 더더욱. 그럴 땐 내가 원하는 방법으로 정렬하여 조금이나마 보기 좋게 만들어서 필요한 걸 찾아보자. 근데 정렬을 하기 위해서 일단 먼저 랜덤하게 배치해야된다는게 아이러니
일단 랜덤으로 돌아가는 카드뭉치를 만들었다. 카드의 구조는 대충 이런식으로 만들었음.
using UnityEngine;
public enum CardValue
{
Ace = 1, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King
}
public enum CardSuit
{
Heart, Diamond, Spade, Clover
}
public class Card
{
public CardValue value;
public CardSuit suit;
private Image image;
public Card(CardValue _value, CardSuit _suit)
{
value = _value;
suit = _suit;
}
}
그리고 카드들을 담아둘 리스트를 만들고, 카드를 쓰까주는 메서드만 만들었다.
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
List<Card> cards = new List<Card>();
private void Awake()
{
foreach (CardSuit suit in Enum.GetValues(typeof(CardSuit)))
{
foreach (CardValue value in Enum.GetValues(typeof(CardValue)))
{
Card card = new Card(value, suit);
cards.Add(card);
}
}
private void ShuffleCards(ref List<Card> cards)
{
System.Random rand = new System.Random();
int n = cards.Count;
while (n > 1)
{
int k = rand.Next(n--);
Card temp = cards[n];
cards[n] = cards[k];
cards[k] = temp;
}
}
}
그럼 리스트에 카드가 엉망진창으로 담기게 된다. 그리고 그냥 C#에서 제공하는 Linq로 소팅해주면 됨.
private void SortCard(ref List<Card> cards)
{
cards = cards.OrderBy(x => x.suit).ToList();
Refresh(cards); // 이건 그냥 UI 화면 업데이트 하는 메서드
}
private void SortCard2(ref List<Card> cards)
{
cards = cards.OrderByDescending(x => x.suit).ToList();
Refresh(cards);
}
private void SortCard3(ref List<Card> cards)
{
cards = cards.OrderBy(x => x.value).ToList();
Refresh(cards);
}
private void SortCard4(ref List<Card> cards)
{
cards = cards.OrderByDescending(x => x.value).ToList();
Refresh(cards);
}
근데 이런 간단한 정렬은 리스트의 Sort
를 통해 처리할 수도 있다.
private void SortCard(List<Card> cards, Comparison<Card> compare)
{
cards.Sort(compare);
Refresh(cards);
}
이렇게 외부에서 정렬방법을 전달해줘서 정렬하면됨. 매개변수로 소팅형식을 전달하면 된다. 예를 들어
if(Input.GetKeyDown(KeyCode.Space))
{
SortCard((x, y) => x.suit.CompareTo(y.suit));
}
이러면 무늬를 비교해서 오름차순으로 정렬하게 된다. Linq를 안써서 오버헤드도 안생김!
오늘의 결론 : 데이터 구조체 내부에 소팅을 위한 적절한 데이터를 삽입해둔다면 필요에 따라 손쉽게 원하는 순서대로 정렬이 가능하다.