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 빼고도 되고 반환 방식 바꿔서 컬렉션 좀 덜 쓰게도 되긴 할 거임
심심풀이로 잠깐 해본 거라 더 가면 오바인듯
나는 못 알아 듣겠지만, 뭔가 멋있다!ㅋ
c#을 쓰는 이유중하나지 linq 꼭써라 두번 써라
linq가 진짜 쓰다보면 이런 선녀가 없음 ㄹㅇ
글고보니 라이더 쓰면 포문 알아서 변환해주는데
내 애완 ai가 유니온 뭐시기로 바꿔주긴 함