【问题标题】:Combine two expressions using LINQ?使用 LINQ 组合两个表达式?
【发布时间】:2017-08-07 19:44:29
【问题描述】:
    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 的全部目的是避免 foreach。

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

【问题讨论】:

    标签: c# unity3d


    【解决方案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;
    }
    

    您当然可以将这段代码缩短很多,但如果您确实需要在这两者之间做一些事情,那么您有机会。

    【讨论】:

      【解决方案2】:

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

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

      如果您愿意,您可以将这些链接起来,例如,您还可以为所有获得奖励的人调用“Bonus”(其中 Reward 返回 true)

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

      然后你写一个方法来执行“Bonus”

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

      【讨论】:

        【解决方案3】:

        如果您只想增加TotalEXP 的值并且不使用检索到的GameObject 在其他地方,您可以使用let 并检索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ᴏʀʏ 答案,您可以在其中检索GameObjectTotalEXP

        【讨论】:

          【解决方案4】:

          尝试在 LINQ 上搜索“let”语句。也许它可以帮助你。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多