【问题标题】:True is not true? [closed]真实不真实? [关闭]
【发布时间】:2013-03-19 18:19:42
【问题描述】:

我遇到了一个不正确的问题。这听起来有点奇怪,我也这么认为,这就是为什么我想我会就此展开讨论。

这是我的精简代码:

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。

【问题讨论】:

  • 您的 Console.WriteLine() 在 foreach 循环之外,因此它只有数组中最后一个元素的值,这是错误的。如果你将 Console.WriteLine() 移动到 foreach 中,那么你应该得到完整的序列,打印出正确的真假......
  • 您的代码未评估。 LOOP 的用途是什么,仅使用 microsoft LINQ 的大部分用于循环省略。

标签: c# arrays foreach boolean console-application


【解决方案1】:

第7个值是true,但是第8个值是false,覆盖myIsShouldBeTrue中的true

您可以对每个值进行 OR,因此如果存在 true,它将被持久化:

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

【讨论】:

  • 如何防止它被覆盖?我觉得我的价值不能被 .net 破坏,这很奇怪。
  • 如果要在到达数组末尾之前停止,则不应使用 foreach 循环
  • 我发现 .net 不能让某人脱离循环非常原始。我现在很失望。
  • @RagingDave 添加了一些可能会做你想做的事情的代码。
  • @RagingDave 当然可能做你想做的事,只是你没有正确编码。更肯定存在足够的语言功能来完全满足您的需求。最简单的方法是bool areAnyTrue = myValuesBls.Any(b =&gt; b);(如果需要,您也可以使用循环来完成。)请注意,您没有在问题中要求提供返回布尔值的代码,指示数组中的任何值是否为真,您要求我们解释为什么您的代码会这样做。
【解决方案2】:

当你尝试这个时会发生什么?

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我为什么要限制我的数组,让它总是以 true 结尾?
    • 因为在循环 foreach (bool valueBl in myValuesBls) { myIsShouldBeTrue = valueBl; } 在最后一次迭代中 myIsShouldBeTrue 将等于 valueBl[9] 等于 FALSE
    【解决方案4】:

    如果将 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。

    【讨论】:

    • 我试过你的解决方案: if (valueBL == true) return;我现在根本没有输出。
    • @RagingDave 什么语言? C#?我正在编辑我的答案以演示 java 版本,我没有用 c# 编码,但它非常相似
    • @RagingDave .NET 不是一种语言。本例中的语言是 C#。
    【解决方案5】:

    你拥有的循环:

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

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

    根据您的 cmets,您似乎想要确定数组中的任何值是否为真。我们可以通过多种方式做到这一点。与您的代码密切相关,我们可以将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);
    

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

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 2012-07-01
      • 2010-09-11
      • 2013-03-28
      • 2014-12-26
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多