Deff_Dev

[Unity/C#] Predicate를 이용한 중복 제거 랜덤 요소 반환 프레임워크 본문

Unity(유니티)/유니티 공부

[Unity/C#] Predicate를 이용한 중복 제거 랜덤 요소 반환 프레임워크

Deff_a 2024. 7. 16. 13:04

Predicate

  • 반환 값이 반드시 Bool이고 입력 파라미터가 1개인 Delegate이다.
  • 반환 타입을 정해야줘야 하는 Func와 달리 Bool 타입으로 고정이기 때문에 사용 목적을 명확하게 전달할 수 있다.
List<int> numbers = new List<int> { -1, 5, 0, -3, 10 };

// Predicate 정의
Predicate<int> isPositive = delegate (int x)
{
    return x > 0;
};

// 리스트에서 조건을 만족하는 요소 찾기
int firstPositive = numbers.Find(isPositive);

Console.WriteLine("첫 번째 양수: " + firstPositive);

중복 제거한 랜덤 요소 반환 프레임 워크

HashSet을 이용한 중복제거 코드를 모든 타입의 리스트, 배열이 사용할 수 있도록 프레임워크화 했다.

 

[Unity/C#] HashSet를 이용한 중복 제거

HashSet중복 값을 허용하지 않는 컬렉션 HashSet의 장점중복 제거 : 중복된 값이 자동으로 제거된다.빠른 검색 : 값이 존재하는지 탐색하는데 시간 복잡도가 O(1)이다.빠른 삽입/삭제 : 요소의 삽입/

deff-dev.tistory.com

 

모든 타입에 대응될 수 있도록 제네릭 메소드로 선언하고 매개 변수로 IList<T>, Count, Predicate<T>를 받는다.

  • IList는 배열과 List가 상속받는 인터페이스로 IList를 상속받는 모든 타입에 대응하기 위해서 사용한다.
  • Count는 반환되는 요소들의 갯수이다.
  • Predicate<T>는 선택적 매개변수로, 중복 제거 시 필요한 조건을 설정하는 데 사용된다.
public static HashSet<T> GetUniqueCollections<T>(IList<T> collection, int count, Predicate<T> predicate = null)
{
    HashSet<T> hash = new HashSet<T>();
    for (int i = 0; i < count; i++)
    {
        int rand = Random.Range(0, collection.Count);

        if ((predicate == null || predicate(collection[rand])) && !hash.Add(collection[rand]))
        {
            i--;
        }
    }
    return hash;
}

사용

조건이 없을 때

public Transform[] EnemyWayPoints;

HashSet<Transform> randomPoint = CollectionUtils.GetUniqueCollections(EnemyWayPoints, 2);

 

중복을 제거한 2개의 요소를 반환한다.

 

조건이 있을 때

public Transform[] EnemyWayPoints;

HashSet<Transform> randomPoint = CollectionUtils.GetUniqueCollections
			(EnemyWayPoints, 2, point => point != EnemyWayPoints[0]);

 

0 번째 Point 이외의 요소들 중에 중복을 제거한 2개의 요소를 반환한다.