使用LINQ组合两个表达式?

时间:2017-08-07 19:44:29

标签: c# unity3d

    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方法,以防我想在中间执行某些操作?

4 个答案:

答案 0 :(得分:1)

您可以通过多种方式执行此操作,但对您的查询进行一次小的更改可以让您只接听一次:

首先,摆脱null检查,只需返回victorcomponent的地图:

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”语句。也许它可以帮到你。