728x90
public static IEnumerable<AAA> GetData(AAAType type)
{
var groupList = new List<int>();
int categoryID = (int)type + 1;
return Database.Shared.GetDatas<AAA>()
.Where((data) =>
{
if (groupList.Contains(data.GroupID) || data.CategoryID != categoryID)
return false;
groupList.Add(data.GroupID);
return true;
})
.OrderBy(data => data.GroupID);
}
이 코드에는 문제가 있다.
힌트는 클로저
디버그로 저 함수를 통해 받은 컬렉션의 갯수를 찍어보았다.
var aaa = Data.GetData(AAAType.A);
Debug.Log(aaa.Count());
Debug.Log(aaa.Count());
첫번째 : 30개
두번째 : 0개
???..
왜 두번째에서 0개가 나오는가 ....
이유는 LINQ는 지연평가가 이루어 지므로
Count()를 호출할때 평가를 하게 되는데 첫번재 Count()를 실행하여 GetData의 LINQ가 처리 될때는 groupList가 처음 생성되고 조건에 맞게 처음 Add가 되어 정상적으로 Count가 잘 나온것이였고
두번째 Count()를 호출할때는 groupList가 클로져로 사용되었고 캡쳐 되었다 보니 지워지지 않고 그대로 유지 된 채로 존재하고 groupList에는 이미 해당하는 데이터에 groupID가 들어있어서 위의 조건인
if (groupList.Contains(data.GroupID) || data.CategoryID != categoryID)
return false;
에 의해 전부다 false로 팅겨내어서 아무런 데이터가 없는 채로 반환된것이였다..
인지하고 잘 쓰자 ...
728x90
'C#' 카테고리의 다른 글
확률 뽑기 로직 정리 (0) | 2022.03.03 |
---|---|
서버 동기화 방식 (0) | 2021.07.23 |
C# - 유니티, 직렬화(Serialization) (0) | 2021.07.23 |
C# - 함수형 프로그래밍, 모나드 패턴 (0) | 2021.07.23 |
C# - 함수형 프로그래밍, 지연 - 캐시 기법 (0) | 2021.07.23 |