-3

我有一个问题,真实不真实。这听起来有点奇怪,我也这么认为,这就是为什么我想我会就此展开讨论。

这是我的精简代码:

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。

4

5 回答 5

1

The 7th value is true, but then the 8th value is false, overwriting the true value in myIsShouldBeTrue

You could OR each value, so if a true exists, it will be persisted:

foreach (bool valueBl in myValuesBls)
{
    myIsShouldBeTrue = myIsShouldBeTrue || valueBl;
}
于 2013-03-19T18:21:13.973 回答
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 循环。

注意:它可能无法像我期望的那样工作,因为我已经从 VB 转换了代码,因为我的 VB 技能更好

于 2013-03-19T18:44:44.657 回答
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);
    }

这将输出真。

于 2013-03-19T18:27:56.020 回答
0

myIsShouldBeTrue = valueBl[9]到底应该FALSE 这么 Console.WriteLine(myIsShouldBeTrue)输出FALSE

于 2013-03-19T18:23:15.050 回答
0

您拥有的循环:

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

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

根据您的评论,您似乎想确定数组中的任何值是否为真。我们可以通过多种方式做到这一点。与您的代码密切相关,我们可以将其设置为与当前项目myIsShouldBeTrue进行 ORed 的结果。myIsShouldBeTrue这样,该行将显示为“要么我已经找到了一个真实的价值,要么这个项目是真实的”。代码更改非常简单:

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

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

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

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

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

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

如果任何值是真的,那么myIsShouldBeTrue将是真的。最终的结果是代码与我们之前的循环并没有太大的不同,尽管它更容易应用于Any更棘手的问题,而且它在阅读方面做得很好,就像我们的要求一样。一旦你习惯了语法,就会更容易看出作者的意图是什么。

于 2013-03-19T18:56:08.470 回答