2017-08-07 10 views
0
var EXPEarners = 
     from victor in ins.BattleParticipants 
     where victor.GetComponent<TotalEXP>() != null 
     select victor; 
    foreach (GameObject victor in EXPEarners) 
    { 
     victor.GetComponent<TotalEXP>().value += EXPGain; 
    } 

私はLINQを使い始めました。私はいくつかの助けが必要です。私はGetComponent()を2度呼び出す必要はないので、これらの2つのコードブロックを組み合わせる方法はありますか? (私はUnityを使用しています)おそらく一時変数を導入し、代わりにforeachループを使用しますか?しかし、LINQを使う目的はforeachを避けることでした。LINQを使用して2つの式を結合しますか?

また、LINQ文の間にメソッドを挿入する方法がありますか?最終的な結果を選択する前にvoidメソッドを呼び出すようにします。

答えて

1

あり、あなたがこれを行うことができますいくつかの方法がありますが、あなたのクエリに一つの小さな変更が単一の呼び出しにあなたを得るでしょう:

まず、nullチェックを取り除くと、単にvictorのマップを返し、 component:次に

var EXPEarners = 
    from victor in ins.BattleParticipants 
    select new { 
     victor, 
     component = victor.GetComponent<TotalEXP>() 
    }; 

、各ペアをループ、componentnullない場合に経験ポイントを追加:

foreach (var participant in EXPEarners) 
{ 
    // can do something with participant.victor here 
    if (participant.component != null) 
     participant.component.value += EXPGain; 
} 

もちろん、このコードをかなり短くすることはできますが、その間に何かする必要がある場合は、機会があります。

-1

LINQで "let"ステートメントを検索してみてください。たぶんあなたを助けることができます。

0

だけTotalEXP値をインクリメントしたいとあなたがletを使用してTotalEXPのコレクションretriveことができますどこかretrived GameObjectを使用しない場合:それ以外の場合は

var TotalEXPs = 
     from victor in ins.BattleParticipants 
     let component = victor.GetComponent<TotalEXP>() 
     where component != null 
     select component; 

    foreach (TotalEXP expin TotalEXPs) 
    { 
     exp.value += EXPGain; 
    } 

を、あなたはCᴏʀʏがどこに答える@見ることができますあなたはGameObjectとそれTotalEXP

1

をretriveすることができますあなたはこの代替を試みることができる:

// Dosomething for every item in the list 
ins.BattleParticipants.All(gameObject => Reward(gameObject, EXPGain)); 

は、その後、あなたが

static bool Reward(GameObject gameObject, int EXPGain) 
    { 
     TotalEXP exp = gameObject.GetComponent<TotalEXP>(); 
     if (exp != null) 
     { 
      exp.value += EXPGain; 
      return true; 
     } 
     return false; 
    } 

が好きそして、あなたがしたい場合、あなたは、チェーンこれらをできる限り複雑になることがあり、「報酬」を、実行する方法を記述し、たとえば、あなたはまた、「ボーナス」のために呼び出すことができますので、あなたが報わすべてのそれらの(報酬が真を返している)

// Reward all EXPGain in the list then give them a Bonus 
ins.BattleParticipants.Where(gameObject => Reward(gameObject, EXPGain)).All(gameObject => Bonus(gameObject, BONGain)); 

次にあなたが「ボーナス」を実行するためのメソッドを書く

static bool Bonus(GameObject gameObject, int BONGain) 
    { 
     SomeOther soc = gameObject.GetComponent<SomeOther>(); 
     if (soc != null) 
     { 
      soc.value += BONGain; 
      return true; 
     } 
     return false; 
    } 
関連する問題