2017-03-01 4 views
3

Linq를 사용하여 다음 코드를 단순화 할 수 있습니까?변환시 foreach 변환

Transform parent; 
List<GameObject> children = new List<GameObject>(); 
foreach (Transform child in parent) 
{ 
    children.Add(child.gameObject); 
} 

나는 parent.ForEach()를 쓰려고했지만 변환은 그렇게 편리하지 않습니다. 누구든지 이것에 대한 단순화를 알고 있습니까?

이것은 호기심에 불과하며 반드시 필요한 것은 아닙니다.

EDIT : parent는 자식의 목록이 아니라 변형입니다.

Attempt at Balázs' answer

+1

'children.AddRange (부모)' "부모"목록 인 경우 아이들의 편집 : 변환 IEnumerable 구현 몰랐다. 시원한! – Maakep

+0

부모는 변형입니다. 혼란스러워서 죄송합니다. – Alox

+0

Transform은 Unity의 MonoBehaviour에 고유 한 클래스입니다. 여기에는 GameObject의 위치, 회전 및 크기 및 자식 요소를 반복하는 IEnumerable implemenets에 대한 정보가 포함됩니다. – Maakep

답변

4

경우 먼저 Linq를 사용하기 전에 일반 버전으로 변환해야합니다

List<GameObject> children = parent 
           .Cast<Transform>() 
           .Select(t => t.gameObject) 
           .ToList(); 
+0

나는 왜 변환에 주조 부모가 왜 이미 변환이 가능할 때 그것을 혼란스럽게하는지에 관해서 다소 혼란 스럽다. 그러나 그것은 작동하고 한 줄로 어떻게해야하는지에 대한 나의 질문에 대답한다. – Alox

+2

당신은' 부모 '자체를'변형 '시킨다. '캐스트 '는 열거 형의 * 요소 *를 지정된 유형으로 변환합니다[email protected]가 말했듯이, Transform은'IEnumerable'을 구현하지만'IEnumerable '는 구현하지 않습니다. 왜냐하면 그 기능에 접근 할 때 그것은 마치 IEnumerable 로 작업하고있는 것과 같습니다. ** ** IEnumerable >은 아니지만 효과는 동일합니다. 유형 정보가 손실됩니다. 결론적으로, 콜렉션의 요소가 사실'Transform'인지 확실하지 않다는 것을 알려줌으로써 컴파일러를 만족시키기 위해'Cast '을 호출해야합니다. –

+0

와우, 정말 멋지 네요, 정보에 대한 Balazz 감사합니다. 나는 이것들에 대해 배우는 것을 즐긴다. 그리고 나는 그것이 미래에 편리하게 올 수있을 것이라고 확신한다. :) – Alox

4

귀하의 경우는 Linq에를 사용하여 예상대로 해결하려고하지 않습니다. 당신이 할 수있는 한 가지 방법은 아래와 같은 확장 방법을 사용하는 것입니다.

IEnumerable<Transform> trs = parent.GetChildren(); 

편집 :

public static class Extension{ 
    public static IEnumerable<Transform> GetChildren(this Transform tr) 
    { 
     List<Transform> children = new List<Transform>(); 
     foreach (Transform child in tr) 
     { 
      children.Add(child); 
     } 
     // You can make the return type an array or a list or else. 
     return children as IEnumerable<Transform>; 
    } 
} 

은 당신이로 사용 마법은 매개 변수에이 키워드에 발생합니다. 이 메소드는 인스턴스에 의해 호출되지만 실제로는 정적입니다. 호출 인스턴스가 매개 변수 목록에 추가됩니다. 너무 깊어지기보다는 인스턴스에서 정적 메서드를 사용할 수있게합니다. 특정 네임 스페이스에 배치하지 않으면 코드에 추가 할 필요가 없습니다. Transform 다음 IEnumerable 있지만 IEnumerable<Transform>를 구현

+0

변환을 수정하지 않아도 되겠습니까? 또는 나는 그것을 오해하고 있는가? – Alox

+0

대신 부모를 GetChildren (부모)의 매개 변수로 전달해야하지 않습니까? – Alox

+0

@Alox 이것은 변형 클래스를 수정하기 위해서만 나타나는 * 확장 메소드입니다 (첫 번째 매개 변수 앞에'this' 키워드가 있습니다). 게시물에서와 같이 사용할 수 있습니다. –