获取bool为false的数组中的第一项

时间:2016-09-15 13:16:58

标签: c# linq unity3d

我的游戏中有GameObjects产生,这些对象被保存在一个数组中。 该数组按距离玩家的距离排序。

如果玩家已经获得了他的目标(其中一个对象),那么该对象就是他的布尔值"声明"需要设置为true,以便其他玩家不再能够获得该对象。

相反,他们需要获取该数组的第一项,其中布尔值为#34; Claimed"是假的。

public void SearchFood()
{
    AllFood = GameObject
        .FindGameObjectsWithTag("Food")
        .OrderBy(x => Vector3.Distance(this.transform.position, x.transform.position))
        .ToArray();

    ClosestPieceOfFood = AllFood
        .First(Claimed => ClosestPieceOfFood.GetComponent<Food>().Claimed == false);

    ClosestPieceOfFood.GetComponent<Food>().Claimed = true;
}

该功能的第二条规则不起作用,我怀疑问题出现在&#34; Claimed =&gt;&#34;但是作为林奇的新手,我真的不知道问题出在哪里。

我的控制台日志中没有任何错误,无论是什么情况。

2 个答案:

答案 0 :(得分:7)

lambda只是编写函数的简便方法。在First的情况下,它需要在数组的每个项目中传递一个lamba并返回bool,它将停止并返回从lambda导致true的第一个项目。所以我觉得你真的想要这样的东西。

ClosestPieceOfFood = AllFood.First(Food => Food.GetComponent<Food>().Claimed == false);

或者我个人更喜欢

ClosestPieceOfFood = AllFood.First(Food => !Food.GetComponent<Food>().Claimed);

如果没有无人认领的食物,您可能还需要考虑使用FirstOrDefault。在这种情况下,这将返回null,因为First会抛出异常。然后,您需要检查ClosestPieceOfFood是否为null并正确处理该案例。

此外,您可以组合创建数组的代码并找到第一个无人认领的食物,并跳过创建数组。

ClosestPieceOfFood = GameObject
    .FindGameObjectsWithTag("Food")
    .OrderBy(x => Vector3.Distance(this.transform.position, x.transform.position))
    .Select(x => x.GetComponent<Food>())
    .FirstOrDefault(Food => !Food.Claimed);

if(ClosestPieceOfFood != null)
    ClosestPieceOfFood.Claimed = true;

答案 1 :(得分:2)

public void SearchFood()
{
    var food = GameObject.FindGameObjectsWithTag("Food")
           .OrderBy(x => Vector3.Distance(this.transform.position, x.transform.position)
           .First(x => x.GetComponent<Food>().Claimed == false);
    food.GetComponent<Food>.Claimed = true;
}

你的代码看起来有点奇怪而且脱离了上下文,所以这可能是非常错误的。

但我觉得你对lambdas的工作方式感到有些困惑。 你也可以链接Linq方法,这样就可以方便地强制执行多次枚举。