https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=179377&page=1

이건 아니야..

using System.Collections.Generic;using UnityEngine;[CreateAssetMenu(fileName =

gall.dcinside.com



public class WaveData   { public List<SpawnData> SpawnDatas; }
public class SpawnData  {public EnemyData EnemyData;}
public class EnemyData
{
    public AssetRef AssetRef;
    public List<SkillConfig> SkillConfigs;
}
public class SkillConfig{public List<SkillData> SkillDatas;}
public class SkillData  {public List<AssetRef> GetVFXAssetRefs() => new();}
public class AssetRef{}


일단 클래스 대충 정의 해놓고 Linq로 바꿔봄


    public List<AssetRef> GetEnemyAssetRefsLinq()
    {
        IEnumerable<EnemyData> enemyDatas = waves.Where     (w  => w.SpawnDatas != null)
                                                 .SelectMany(w  => w.SpawnDatas)
                                                 .Where     (sd => sd.EnemyData != null)
                                                 .Select    (sd => sd.EnemyData);

        HashSet<AssetRef> uniqueRefs = enemyDatas.SelectMany
        (
            enemyData => enemyData.SkillConfigs.SelectMany
            (
                conf => conf.SkillDatas.SelectMany(skill => skill.GetVFXAssetRefs())
            )
        )
        .ToHashSet();  

        uniqueRefs.UnionWith(enemyDatas.Where(data => data.AssetRef != null).Select(d=>d.AssetRef));
        return new List<AssetRef>(uniqueRefs);
    }


그리고 저기서 기능 부분부분 떼서 함수로 만들 수 있는데

여기서만 쓰는 게 아니라 재사용 가능한 범용 기능 만든다고 생각으로 하면

한 번만 쓴다고 합리화 하는 거 잡을 수 있을 거임 아마...


public static partial class AssetRefLinqHelper
{
    public static IEnumerable<EnemyData> GetEnemyDatas(this WaveData waveData)
    => waveData?.SpawnDatas
        .Where(sd => sd.EnemyData != null)
        .Select(sd => sd.EnemyData)
    ;

    public static IEnumerable<EnemyData> GetEnemyDatas(this IEnumerable<WaveData> waveDatas)
    => waveDatas?.SelectMany(GetEnemyDatas);


    public static IEnumerable<AssetRef> GetAssetRefs(this EnemyData enemyData)
    => enemyData?.SkillConfigs.SelectMany
        (conf => conf.SkillDatas.SelectMany
            (skillData => skillData.GetVFXAssetRefs())
        )
    ;

    public static IEnumerable<AssetRef> GetAssetRefs(this IEnumerable<EnemyData> enemyData)
        => enemyData?.SelectMany(GetAssetRefs);
}


확장메소드로 했는데 클래스 함수로 만들지 델리게이트로 할지 뭐 그런 건 자기 맘이고

이제 이걸 사용하면 


    public List<AssetRef> GetEnemyAssetRefsLinq2()
    {        
        IEnumerable<EnemyData> enemyDatas = waves.GetEnemyDatas();
        HashSet<AssetRef> uniqueRefs = enemyDatas.GetAssetRefs().ToHashSet();
        uniqueRefs.UnionWith(enemyDatas.Where(data => data.AssetRef != null).Select(d=>d.AssetRef));
        return new List<AssetRef>(uniqueRefs);
    }


이렇게 쓸 수 있음

기능 검증은 안 해봤는데 느낌만 보라고 올림


한 번만 도는거라 해서 막 했는데 linq 빼고도 되고 반환 방식 바꿔서 컬렉션 좀 덜 쓰게도 되긴 할 거임

심심풀이로 잠깐 해본 거라 더 가면 오바인듯