2017-03-01 4 views
3

Kann der folgende Code mit Linq vereinfacht werden?Vereinfachung foreach on Transform

Ich hatte gehofft einfach Eltern zu schreiben. Kennt jemand eine Vereinfachung dafür?

Dies ist nur Neugier und nicht notwendig.

EDIT: Eltern ist keine Liste von Kindern, aber eine Transformation.

Attempt at Balázs' answer

+1

'children.AddRange (Eltern)' wenn „Eltern“ ist eine Liste von Kindern. Edit: Wusste nicht Transform implementiert IEnumerable. Cool! – Maakep

+0

Eltern ist eine Transformation, Entschuldigung für die Verwirrung. – Alox

+0

Transformation ist eine für Unity's MonoBehaviour spezifische Klasse. Es enthält Informationen über die Position, Rotation und Skalierung eines GameObjects und implementiert IEnumerable, das auf seinen untergeordneten Elementen iteriert. – Maakep

Antwort

4

Wenn TransformIEnumerable implementiert, aber nicht IEnumerable<Transform> dann zuerst Sie es auf die generische Version konvertieren müssen, bevor Sie Linq verwenden können:

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

Ich bin etwas verwirrt, warum Eltern in eine Transformation zu transformieren, wenn es bereits eine Transformation ist, erlaubt es zu arbeiten ... aber es funktioniert und es beantwortet meine Frage, wie man es ein Zeilen ... – Alox

+2

Sie sind nicht die Casting sich selbst "transformieren". Das 'Cast ' wandelt die * Elemente * in einem Enumerable in den angegebenen Typ um.Wie @Hans sagt, implementiert Transform "IEnumerable", aber nicht "IEnumerable ". Beim Zugriff auf seine Funktionalität verhält es sich so, als ob Sie mit einem IEnumerable arbeiten würden. Es ist nicht ** IEnumerable > ', aber der Effekt ist der gleiche - Sie verlieren Typinformationen. Die Quintessenz ist also, dass Sie 'Cast ' aufrufen müssen, um den Compiler zu erfüllen, indem Sie ihm sagen, dass Sie absolut sicher sind, dass die Elemente in der Sammlung tatsächlich 'Transform's sind. –

+0

Wow, das ist ziemlich toll, danke @ Balázs für die Informationen, ich genieße es, über diese Dinge zu lernen, und ich bin mir sicher, dass es in Zukunft nützlich sein könnte :) – Alox

4

Ihr Fall geht zu arbeiten, nicht, wie Sie Linq erwarten verwenden. Eine Sache, die Sie tun können, ist die Verwendung einer Erweiterungsmethode wie unten gezeigt.

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>; 
    } 
} 

und verwenden Sie es als:

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

EDIT: die Magie passiert auf dem dieses Schlüsselwort in den Parameter. Die Methode wird von der Instanz aufgerufen, ist aber tatsächlich statisch. Die aufrufende Instanz wird zur Parameterliste hinzugefügt. Ohne zu tief zu gehen, wird eine statische Methode für eine Instanz verfügbar gemacht. Sie benötigen keinen zusätzlichen Code, wenn Sie nicht in einem bestimmten Namespace platziert werden.

+0

Wäre das nicht erforderlich, Transform zu ändern? Oder verstehe ich das falsch? – Alox

+0

Soll ich statt Eltern als Parameter von GetChildren (Eltern) übergeben? – Alox

+0

@Alox Dies ist eine "Erweiterungsmethode", die nur * erscheint *, um die Transformationsklasse zu modifizieren (siehe das Schlüsselwort 'this' vor dem ersten Parameter). Sie können es * wie in der Post benutzen. –