私はUnityを使用しています。 IEnumerable.Select()を使用して、タイプのリストを取得し、それらを(コンポーネントとして)GameObjectに追加します。この実行 :newObjectsが一つだけの参照を含んでいるがC# - LINQ Select()関数を2回呼び出します。
var newObjects = types.Select(t => (IGameManager)gameObject.AddComponent(t));
は実際には、当該ゲームオブジェクトにコンポーネントの同じタイプのを加算します。作成されたもう1つのコンポーネントは、参照を返さずに浮遊します。
foreach(var t in types)
{
newObjects.Add((IGameManager)gameObject.AddComponent(t));
}
ワークス、唯一のゲームオブジェクトに各コンポーネントタイプのいずれかを追加します。 はこれを実行します。しかし、それはちょっと醜いように見えます。 (IGameManagerは、問題のすべての種類のインターフェイスを実装しています)
foreachループを使用することはできますが、それは完全に雄弁ではなく、この動作を説明するオンライン記事を見つけることができず、私の好奇心私の方が良くなっています。
私の質問は、Select()は指定された関数を入力ごとに2回呼び出しますが、結果データのコピーは1つだけ返すのはなぜですか?そして、どのように私はこの動作を修正/防止/補償するのですか?
ありがとうございます!
types.Select(トン=>(IGameManager)gameObject.AddComponent(t))のToListメソッド()。 – loneshark99
'Select()'は提供されたデリゲートを呼び出さない。これは、遅延実行された 'IEnumerable'オブジェクトのみを構築します。結果の 'IEnumerable'オブジェクトを列挙するたびにデリゲートが呼び出されます。 – PetSerAl