2017-08-07 85 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()两次? (我正在使用Unity。)也许引入一个临时变量并使用foreach循环来代替?但使用LINQ的全部目的是为了避免这种习惯。使用LINQ组合两个表达式?

另外,有没有办法在LINQ语句之间插入方法,比如在我选择最终结果之前调用一个void方法,以防我想在“之间?

回答

1

有很多的,你可以做到这一点的方式,但一个小的改动,您的查询就会让你一个电话:

首先,摆脱null检查和简单的返回地图victorcomponent

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价值,你不使用retrived GameObject别的地方,你可以使用let和retrive的TotalEXP集合:

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ᴏʀʏ答案在你可以retrive GameObjectTotalEXP

1

你可以试试这个替代方案:

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

如果你愿意,你可以链接这些,因为复杂,所以,例如,你也可以叫“红利”为你奖励那些(其中奖励返回TRUE)

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