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(親の)'「親」リストがある場合子どもたちの。編集:TransformがIEnumerableを実装しているのを知らなかった。クール! – Maakep

+0

親はTransformです、混乱のために残念です。 – Alox

+0

Transformは、UnityのMonoBehaviour固有のクラスです。これには、GameObjectの位置、回転、スケールに関する情報と、その子要素を反復するIEnumerableのインプリメンテーションが含まれます。 – Maakep

答えて

4

場合は、最初にあなたがLINQの使用する前に、一般的なバージョンに変換する必要があります。

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

私は幾分混乱しています。なぜなら、トランスフォームに変換の際に親をキャストすることは、それが動作することを可能にします...しかし、それは機能し、それは1行にどのようにしているのかについての私の質問に答える... – Alox

+2

' 「親」自身を「変形」する。 'キャスト'は、列挙可能な要素の*要素*を指定された型にキャストします。@Hansが述べたように、Transformは 'IEnumerable'を実装していますが、' IEnumerable 'は実装していません。その機能にアクセスすると、IEnumerable で作業しているかのようです。 ** ** IEnumerable >ではありませんが、効果は同じです。タイプ情報が失われます。したがって、最終的には、 'キャスト'を呼び出す必要があります。これは、コレクションの要素が実際に 'Transform'であることをあなたが納得していないことを伝えて、コンパイラを満足させるためです。 –

+0

うわー、それはかなり素晴らしいです、情報のための@Balázs、私はこれらのことについて学ぶことを楽しむ、そして私はそれが将来便利になることができると確信しています:) – Alox

4

あなたのケースでは、LINQのを使用して期待通りに仕事に行くされていません。あなたができることの1つは、以下のような拡張メソッドを使うことです。

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

、あなたのようにそれを使用する:

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

EDIT: 魔法は、パラメータにこのキーワードで発生します。このメソッドはインスタンスによって呼び出されますが、実際は静的です。呼び出し元のインスタンスがパラメータリストに追加されます。あまりにも深くなることなく、インスタンス上で静的メソッドを使用できるようにします。特定の名前空間に配置しない場合は、独自のコードを追加する必要はありません。 Transformその後IEnumerableはなく、IEnumerable<Transform>を実装

+0

これはTransformを変更する必要はありませんか?それとも私はそれを誤解していますか? – Alox

+0

代わりに、GetChildren(parent);のパラメータとしてparentを渡すべきではありません; – Alox

+0

@Aloxこれ​​は、変換クラスを変更するために*表示される "拡張メソッド"です(最初のパラメータの前の 'this'キーワードを参照)。あなたは投稿のように使用することができます。 –