버그 해결을 위한 모든 질문을 던져
0 votes
347 views

 

안녕하세요~

 

다름이 아니라 유니티에서 아래와 같은 코딩을 했을 때 원하는 결과가 나오지 않아 질문 드립니다.

 

IEnumerable<Collider> enemies = temp.Where(x => x.tag == "ENEMY");

 

temp라는 객체에서 tag가 ENEMY인 것만 가져오고 싶은데..

 

Where 절에서 제대로 걸러주지 못하네요?? 

 

직접 foreach쓰면 걸러지는데.. 저렇게 하면 안되서 질문 드립니다.

 

혜안을 주시면 감사 드리겠습니다.


추가

제 질문이 명확하지 못한 것 같아 추가 정보를 게시합니다.

var temp; // 특정 게임오브젝트 리스트

이곳에 다음과 같은 데이터가 있다고 가정하겠습니다.

  1. tag가 없는 객체.
  2. tag가 "PLAYER"인 객체.
  3. tag가 "ENEMY"인 객체.
  4. tag가 "ENEMY"인 객체.
이와 같은 상황에서 아래 코드를 실행했을 때
IEnumerable<Collider> enemies = temp.Where(x => x.tag.Equals("ENEMY"));

temp에 tag가 "EMENY"인 3번과 4번 객체가 enemies에 담길 것이라 예상했습니다.

하지만 올바로 작동하지 않았습니다. 

다음과 같이 진행했을 땐 예상과 같이 동작 하였습니다.

var list = new List<Collider>();

foreach (var item in temp)
{
    if (item.tag == "ENEMY")
        list.Add(item);
}

enemies = list;

이러한 결론으로 .Where()가 올바로 동작하지 않나? 라는 생각을 하게 되어 질문하게 되었습니다.

선배님들의 소중한 경험을 공유해 주시면 감사 드리겠습니다.

 

이상입니다.

감사합니다.

asked (22 point)
수정됨 , 347 views

3 answers

+1 vote
우수 답변
안녕하세요 C#을 잘 모르긴 하지만 자바나 C#같은 오브젝트 기반 언어에서 문자열 비교는 .Equals와 같은 함수를 이용하는게 좋다고 알고 있거든요. ==은 레퍼런스 비교라서 경우에 따라서 안될 수 있는것으로 알고있어요.

foreach에서는 어째서 정상적으로 동작했는지는 알 수 없습니다만.. 일단 이쪽을 한번 체크해 보심이 어떨런지요?
answered (186 point)
선택됨

댓글 감사합니다! 확인결과 같은 동작을 하는 것으로 판단 되었습니다.

해당 사항에 대해 공부할 기회가 되었습니다. 감사합니다.

관련되어 이해하기 쉬운 글이 있어 링크를 걸어둡니다.

https://code.i-harness.com/ko-kr/q/c6f1e

*수정

질문을 다시 확인해 보니 유니티에서였군요. 저는 그냥 VS2015 C#환경에서 테스트 한 결과입니다. 이게 유니티에서 다를 수 있는지는 모르겠네요.

----- 원문

제가 간단한 예제를 만들어 테스트 해보았는데요. 잘 되는거 같습니다.
뭔가 다른곳에 문제가 있는게 아닐까요?

List<string> l = new List<string>();
l.Add("ENEMY");
l.Add("PLAYER");
l.Add("CCC");

var f = l.Where(t => t.Equals("ENEMY"));

결과:

f = {"ENEMY"}

 

감사합니다.

우선 동작이 되는 것을 확인했으니 다른 곳에서 문제를 확인해보겠습니다.^^
0 votes
걸러주지 못한다는게 Where 문은 써지는데 foreach 문과 결과값이 다르게 나온다는 뜻인가요?
answered (4 point)
질문을 수정하였습니다.
+1 vote
질문하신 것은 엄밀히 말해서 LINQ가 아니라 단순한 확장 메서드의 호출에 불과합니다. 그리고 그 확장 메서드에 delegate 전달을 람다 표현식으로 한 것이고요.

따라서, 빌드만 된다면 IL 코드로 변환했을 때 특별한 코드가 들어가는 것이 아니기 때문에 실행이 잘못될 이유가 없습니다.

(본문에서 tag가 없는 객체라고 했는데 혹시 tag 속성은 있으나 그 값이 null이라는 건가요? 그렇다면 Where 에 전달한 delegate 수행 시 null 참조 예외가 발생할 것입니다.)
answered (6 point)

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

132 질문
224 answers
258 댓글
247 users