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方法,以防我想在中间执行某些操作?
答案 0 :(得分:1)
您可以通过多种方式执行此操作,但对您的查询进行一次小的更改可以让您只接听一次:
首先,摆脱null
检查,只需返回victor
和component
的地图:
var EXPEarners =
from victor in ins.BattleParticipants
select new {
victor,
component = victor.GetComponent<TotalEXP>()
};
然后,循环遍历每一对,如果component
不是null
,则添加经验值:
foreach (var participant in EXPEarners)
{
// can do something with participant.victor here
if (participant.component != null)
participant.component.value += EXPGain;
}
你当然可以缩短这段代码,但如果你确实需要在两者之间做一些事情,那么你就有机会。
答案 1 :(得分:1)
你可以试试这个替代方案:
// Dosomething for every item in the list
ins.BattleParticipants.All(gameObject => Reward(gameObject, EXPGain));
然后你写了一个方法来执行&#34;奖励&#34;,这可能会像你想的那样复杂
static bool Reward(GameObject gameObject, int EXPGain)
{
TotalEXP exp = gameObject.GetComponent<TotalEXP>();
if (exp != null)
{
exp.value += EXPGain;
return true;
}
return false;
}
如果你愿意,你可以链接这些,所以例如你也可以打电话给&#34;奖金&#34;对于你奖励的所有人(奖励返回真实的地方)
// Reward all EXPGain in the list then give them a Bonus
ins.BattleParticipants.Where(gameObject => Reward(gameObject, EXPGain)).All(gameObject => Bonus(gameObject, BONGain));
然后你写一个方法来执行&#34; Bonus&#34;
static bool Bonus(GameObject gameObject, int BONGain)
{
SomeOther soc = gameObject.GetComponent<SomeOther>();
if (soc != null)
{
soc.value += BONGain;
return true;
}
return false;
}
答案 2 :(得分:0)
如果您只想增加TotalEXP
值并且不在其他地方使用已重试的GameObject
,则可以使用let
并检索TotalEXP
的集合:< / p>
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
答案 3 :(得分:-1)
尝试在LINQ上搜索“let”语句。也许它可以帮到你。