检查数组中所有元素的条件是否为真

时间:2019-12-06 12:48:55

标签: c# arrays for-loop foreach

我在Unity3D中有一个C#数组类型的Transform对象。要赢得游戏,所有图片的rotation.z值必须为0。

Transform[] Pictures;

if (Pictures[0].rotation.z == 0 &&
    Pictures[1].rotation.z == 0 &&
    Pictures[2].rotation.z == 0 &&
    Pictures[3].rotation.z == 0 &&
    Pictures[4].rotation.z == 0 &&
    Pictures[5].rotation.z == 0)
{
    YouWin = true;
    //WinText.enabled = true;//.SetActive(true);
    int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
    SceneManager.LoadScene(currentSceneIndex + 1);
}

但这是丑陋的方式。而且,如果数组扩展,游戏就不会结束。因此,我尝试编写新代码以使事情变得更容易。但是不能。

foreach (var item in Pictures)
{
    if (item.rotation.z == 0)
    {
        YouWin = true;
        int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
        SceneManager.LoadScene(currentSceneIndex + 1);
    }
}

foreach无法正常运行。从第一个图像的foreach存在。必须检查每个图像的rotation.z值。

for (int i = 0; i < Pictures.Length; i++)
{
    if (Pictures[i].rotation.z ==0)
    {
        YouWin = true;
        int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
        SceneManager.LoadScene(currentSceneIndex + 1);
    }
}

“ for”也与foreach相同。我认为它需要嵌套for或foreach。如果rotation.z值等于0,如何检查所有项目?谢谢。

2 个答案:

答案 0 :(得分:4)

  

要赢得游戏,所有 picture的{​​{1}}值必须为rotation.z

让我们借助 Linq 0来实现它:

All

如果您想循环使用 ,则可以反转逻辑- using System.Linq; ... if (Pictures.All(picture => picture.rotation.z == 0)) { // Win YouWin = true; int currentSceneIndex = SceneManager.GetActiveScene().buildIndex; SceneManager.LoadScene(currentSceneIndex + 1); } ,如果我们没有计数器示例YouWin == true

item.rotation.z != 0

答案 1 :(得分:2)

您有几种选择可以执行此任务。 最简单的方法是添加一个额外的标志并取消检查条件。 如果任何图片rotation.z不为0,则您没有赢。 如果所有图片rotation.z为0,则您赢了。

bool success = true;
foreach (var item in Pictures)
{
    if (item.rotation.z != 0)
    {
        success = false;
    }
}
if (success) {
    YouWin = true;
    int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
    SceneManager.LoadScene(currentSceneIndex + 1);
}

或使用Linq:

bool won = pictures.TrueForAll(x=> x.rotation.z == 0);