분명 제가 잘못한것이겠지만 그냥 답변을 바라기 보다는 비슷한 현상을 겪어보신분 있나 해서 올려봅니다.
이중슬립 : 전자의 운동이 관찰의 따라 다르게 발생하는 현상
코드는 예를 들어
c.list = rt.detaillst.Where(p => p.idx== c.idx && p.SystemName.Trim() == "test").ToLiST()
평범하게 프로시져 받아온 데이타를 List 에 담았습니다.
그리고 이걸로 c.list.Count 를 갯수를 헤아렸습니다.
근데 0 이 나옵니다. 분명히 데이타가 있음에도 ;;;
진짜 원인도 모르겠고 원격지 서버라 디버깅도 안되고 하도 답답해서
foreach (var r in rt.detaillst)
{
_logger.LogInformation("00:" +r.idx.ToString() +"|" );
}
부모 리스트 값을 LOG를 찍으니까 Count 값이 3으로 다시 나옵니다.
이게 말이 되는 상황인가 전체적인 코드나 환경을 공유할수 없지만
아니 관찰하지 않을때는 값이 없는데
Log로 관찰을 하니까 데이타 존재하는 현상
예전에는 이런 현상이 없는데 데이타가 커지면서 요근래 생겼습니다.
(10만개 정도)
예전부터 Linq 로 데이타 다룰떄 10만개가 넘으면 뭔가 이상작동을 했던 경험이 있어
Linq 에 대한 불신이 약간 있긴 한데 이번경우는 너무 황당하네요
당연히 제가 뭐 잘못해서 발생한 현상이고 이유는 있을것고 나중에
아 나 바보인가 하겠지만 지금은 그렇네요
rt.detaillst가 어떻게 만들어졌는지 알아야 원인을 추측해 볼 수 있지 않을까요? foreach돌려서 잘 나온다는건 foreach돌리는 순간 rt.detaillst가 평가되었다는거고, 타이밍 이슈가 해소되었다고 보여져요. 위에 @fizzy 님 말씀 처럼요.
그리고 c.idx도 중요해 보입니다.
다른 분들이 말씀하신 내용이지만 Where 조건에서 결과 차이가 있는 것 같습니다.
구체적으로는, Trim의 경우 문자열 끝에 null문자가 들어간 것은 아닐까… 의심도 되구요.
그래서 혹시 모르니 TrimEnd(‘\0’) 또는 Replace하셔서 null문자를 제거해보시는 것도 좋을 것 같습니다.
p.SystemName.TrimEnd('\0')
// 또는
p.SystemName.Replace("\0", "");
범인이 꼭 잡혔으면 좋겠네요…
그리고 LINQ에서 이런저런 이슈가 공공연하게 발생되는지는 댓글보고 처음 알았어요.
다들 신뢰를 못하시는 듯해서 솔직히 충격적입니다.
저는 그동안 당연히 프로그램 언어니까 잘 작동되겠거니… 했거든요.
그나저나 양자역학적 접근이 너무 재밌네요…ㅋㅋ
관련이 있을런지는 모르겠으나, 짤 하나 투척하고 가봅니다…
지연된 평가 때문에 문제가 발생할 수 있습니다. 예를 들어, Where() 메서드를 사용해서 필터링된 결과 목록을 얻은 후 원본 데이터를 수정하면, 이미 생성된 결과 목록이 변하지 않아야 된다고 보통 생각하는데요. 그러나 다시 목록을 조회할 때 원본 데이터의 변경 사항이 반영되어 목록이 달라지는 경우가 발생할 수 있습니다.
다음은 예시 코드입니다.
int[] sourceItems = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var oddItems = sourceItems.Where(x => x % 2 != 0);
// 1, 3, 5, 7, 9 출력
foreach (var item in oddItems)
{
Console.WriteLine(item);
}
Console.WriteLine();
sourceItems[1] = 11;
// 1, 3, 5, 7, 9 출력 되어야 할 것 같지만 1, 11, 3, 5, 7, 9 출력
foreach (var item in oddItems)
{
Console.WriteLine(item);
}