真的不是真的吗?

时间:2013-03-19 18:19:42

标签: c# arrays foreach boolean console-application

我遇到的问题是真实不对。这听起来有点奇怪,我也这么认为,这就是为什么我认为我会讨论它的原因。

这是我的精简代码:

static void Main(string[] args)
    {
        bool[] myValuesBls = new bool[10];

        for (int i = 1; i < 10; i++)
        {
            if (i == 7)
                myValuesBls[i] = true;
            else
                myValuesBls[i] = false;
        }

        bool myIsShouldBeTrue = false;
        foreach (bool valueBl in myValuesBls)
        {
            myIsShouldBeTrue = valueBl;
        }

        Console.WriteLine(myIsShouldBeTrue);
        Console.ReadLine();
    }

值返回false,我很确定这是不可能的。我的数组中的第七项是TRUE。

5 个答案:

答案 0 :(得分:1)

第7个值为true,但第8个值为false,覆盖了true

中的myIsShouldBeTrue

你可以对每个值进行OR,所以如果存在true,它将被保留:

foreach (bool valueBl in myValuesBls)
{
    myIsShouldBeTrue = myIsShouldBeTrue || valueBl;
}

答案 1 :(得分:1)

尝试这种情况会发生什么?

private static void Main(string[] args)
{
bool[] myValuesBls = new bool[10];

for (int i = 1; i <= 9; i++) {
    if (i == 7) {
        myValuesBls[i] = true;
    } else {
        myValuesBls[i] = false;
    }
}

bool myIsShouldBeTrue = false;
foreach (bool valueBl in myValuesBls) {
    myIsShouldBeTrue = valueBl;
    if (myIsShouldBeTrue == true)
        break;
}

Console.WriteLine(myIsShouldBeTrue);
Console.ReadLine();
}

这应该是当你的值为TRUE时退出FOR LOOP。

注意:它可能无法正常工作,因为我已经从VB转换代码,因为我的VB技能更好

答案 2 :(得分:0)

myIsShouldBeTrue = valueBl[9]最终将是FALSE 所以  Console.WriteLine(myIsShouldBeTrue)应输出FALSE

答案 3 :(得分:0)

如果将foreach循环的内容更改为

if(valueBl == true)
{
    myIsShouldBeTrue = valueBl;
}

然后它将输出true。但正如其他人所说,它是一个for循环,所以控制台输出数组中的LAST值,这是假的。

实际上,如果你希望你的循环在循环中达到条件时结束,你应该使用while或do / while循环。 for循环真正用于遍历整个数组。如果你很懒,你也可以通过坚持回归来摆脱for循环;在其中,但你仍然需要一个回归的测试条件

编辑:Java版

public static void main(String[] args)
    {
        boolean[] myValuesBls = new boolean[10];

        for (int i = 1; i < 10; i++)
        {
            if (i == 7)
                myValuesBls[i] = true;
            else
                myValuesBls[i] = false;
        }

        boolean myIsShouldBeTrue = false;
        for(boolean valueBl : myValuesBls)
        {
            if(valueBl == true)  // condition
            {
                myIsShouldBeTrue = valueBl;
            }
        }

        System.out.println(myIsShouldBeTrue);
    }

这将输出true。

答案 4 :(得分:0)

你拥有的循环:

bool myIsShouldBeTrue = false;
foreach (bool valueBl in myValuesBls)
{
    myIsShouldBeTrue = valueBl;
}

遍历数组中的每个项目,并将myIsShouldBeTrue的值设置为当前项目的值。这样做的结果是myIsShouldBeTrue将始终是数组中的最后一项。

根据您的评论,您可能希望确定数组中的任何值是否为真。我们可以通过多种方式实现这一目标。最贴近您的代码,我们可以将myIsShouldBeTrue设置为myIsShouldBeTrue与当前项目进行OR运算的结果。这样,该行将显示为“我已经找到了一个真值,或者这个项目是真的”。代码更改非常简单:

bool myIsShouldBeTrue = false;
foreach (bool valueBl in myValuesBls)
{
    myIsShouldBeTrue |= valueBl;
}

|=运算符将值设置为该值的结果与操作数进行OR运算。

如果我们愿意,我们可以改进此代码。对于初学者来说,一旦我们找到了一个真实的项目,就没有必要继续循环遍历该集合。我们知道结果将是真实的,所以我们可以退出。对于布尔运算,这称为“短路”。

bool myIsShouldBeTrue = false;
foreach (bool valueBl in myValuesBls)
{
    if (valueBl)
    {
        myIsShouldBeTrue = true;
        break;//exit the loop
    }
}

LINQ也是一个很棒的工具,可以在这里使用。它具有基于数据序列聚合结果的操作。在这种特殊情况下,我们想知道是否有任何布尔值为真。我们可以写出来:

myIsShouldBeTrue = myValuesBls.Any(value => value);

如果任何值为真,那么myIsShouldBeTrue将为真。最终的结果是与我们之前的循环没有太大区别的代码,尽管将Any应用于更棘手的问题会更容易一些,并且它会像我们的要求一样完成伟大的阅读工作。一旦习惯了语法,就可以更容易地看到作者的意图。