C# 真的不是真的吗?

C# 真的不是真的吗?,c#,arrays,foreach,boolean,console-application,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] =

我遇到了一个真实与否的问题。这听起来有点奇怪,我也这么认为,这就是为什么我认为我会就此展开讨论的原因

这是我的精简代码:

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。

第七个值为TRUE,但第八个值为false,覆盖了myIsShouldBeTrue中的TRUE值

您可以为每个值添加一个或多个值,因此如果存在一个true,它将被持久化:

foreach (bool valueBl in myValuesBls)
{
    myIsShouldBeTrue = myIsShouldBeTrue || valueBl;
}
myIsShouldBeTrue=valueBl[9]最终将是错误的 所以
Console.writelinemyshouldbetrue应输出FALSE

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

if(valueBl == true)
{
    myIsShouldBeTrue = valueBl;
}
然后它将输出true。但正如其他人所说,这是一个for循环,所以控制台输出数组中的最后一个值,这是错误的

实际上,如果希望循环在循环中达到某个条件时结束,那么应该使用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。

尝试此操作时会发生什么

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技能更好

您拥有的循环:

bool myIsShouldBeTrue = false;
foreach (bool valueBl in myValuesBls)
{
    myIsShouldBeTrue = valueBl;
}
遍历数组中的每个项,并将myIsShouldBeTrue的值设置为当前项的值。这样做的效果是myIsShouldBeTrue将始终是数组中的最后一项

根据您的评论,您似乎想要确定数组中的任何值是否为真。我们有很多方法可以做到这一点。严格按照您的代码,我们可以将myIsShouldBeTrue设置为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);

如果其中任何一个值为true,则myIsShouldBeTrue将为true。最终的结果是代码与我们之前的循环没有太大的不同,尽管将任何代码应用到更难的问题上会更容易一些,而且它在阅读方面做得很好,就像我们的需求一样。一旦你习惯了语法,你就更容易明白作者的意图了

您的Console.WriteLine位于foreach循环之外,因此它将只具有数组中最后一个元素的值,该值为false。如果将Console.WriteLine移动到foreach中,则应使用正确的true和false打印完整的序列……您的代码不会被计算。循环的用途是什么,仅使用microsoft LINQ for LOOP omit的大部分功能。如何防止它被覆盖?我觉得很奇怪,我不能让我的值不被.net破坏。如果你想在数组结束之前停止,就不应该使用foreach循环。我发现.net不能让某人退出循环,这很简单。我现在很失望。@RagingDave添加了一些代码,这些代码可能会满足您的要求。@RagingDave当然可以满足您的要求,您只是没有正确地编写代码。当然,还有更多的语言特性可以完全满足您的需求。最简单的方法是bool areAnyTrue=myValuesBls.Anyb=>b;如果你愿意,你也可以用一个循环。请注意,您在问题中没有要求提供返回布尔值的代码,该布尔值指示数组中的任何值是否为真,而是要求我们解释为什么您的代码会这样做。为什么我要限制数组,使其始终以真结尾?因为在myValuesBls中每个bool valueBl都在循环中{myIsShouldBeTrue=valueBl;}在最后一次迭代中,myIsShouldBeTrue将等于valueBl[9]这等于False我尝试了你的解决方案:如果valueBL==true return;我现在根本没有得到任何输出。@RagingDave什么语言?c?我正在编辑我的答案以演示java版本,我没有用c编写代码,但非常简单similar@RagingDave.NET不是一种语言。本例中的语言是C。