【问题标题】:check whether array contains false?检查数组是否包含错误?
【发布时间】:2011-04-23 07:47:20
【问题描述】:

如何检查数组true_or_false包含的值为false?

bool[] true_or_false = new bool[10];

for (int i = 0; i < txtbox_and_message.Length; i++)
{
  bool bStatus = true;
  if (txtbox_and_message[i] == "")
  {
    bStatus = false;
  }
  true_or_false[i] = bStatus;                           
}

【问题讨论】:

  • 循环在做什么?看起来它(重复)检查空白文本并将 all 元素设置为 true,如果字符串为空白,则设置为 false?
  • 不应该bStatus 以某种方式依赖于i?这就是为什么 PaulG 正确地说所有元素都是相同的。
  • 您是否缺少 txtStarter=txtbox_and_message[i]; ?或者本说了什么?您的代码显然包含错误。
  • 我已经修改了我的问题..

标签: c# .net arrays .net-2.0 contains


【解决方案1】:

如果它们不都是真的,那么至少有一个是假的。

因此:

!true_or_false.All(x => x)

文档:http://msdn.microsoft.com/en-us/library/bb548541.aspx

编辑:.NET 2.0 版本,根据要求:

!Array.TrueForAll(true_or_false, delegate (bool x) { return x; })

Array.Exists(true_or_false, delegate (bool x) { return !x; })

注意:我一直远离设置 true_or_false 的无意义代码,但您可能想要的是:

int emptyBox = Array.FindIndex(txtbox_and_message, string.IsNullOrEmpty);

如果所有字符串都非空,则返回 -1,否则返回失败字符串的索引。

【讨论】:

  • 不,谓词的扩展方法语法和 lambda 表示法都需要 C# 3,但确实存在 .NET 2 版本(请参阅编辑)。
  • 您实际上并不需要委托(匿名函数或 lambda)。你可以做Array.Contains(true_or_false, false),它非常接近标题(检查数组是否包含错误)。那是在 .NET 2.0 上。当您拥有 LINQ 时,还可以使用语法 true_or_false.Contains(false)编辑: 错了!在 .NET 2.0 中,您必须改为使用 Array.IndexOf(true_or_false, false) != -1
  • @JeppeStigNielsen:当然可以,但我的回答表明无需提前准备布尔数组即可找到索引,我认为这比搜索布尔数组更好。
【解决方案2】:
return true_or_false.Any(p => !p);

【讨论】:

  • 很遗憾没有,它需要 3.0 +
  • @krunal:如果你有平台限制,你应该把它们放在问题中。
【解决方案3】:
using System.Linq;

然后:

true_or_false.Contains(false);

【讨论】:

  • 添加 System.Linq 后出现此错误。命名空间“System”中不存在类型或命名空间名称“Linq”(您是否缺少程序集引用?)
  • 你需要在你的项目中添加对system.core dll的引用
  • LINQ 附带 .NET 3.5 和 VS 2008,因此您需要使用迭代解决方案,例如 Pavan 或 BrunoLM 的答案
【解决方案4】:

在您的代码中:

bool containsEmptyText = txtbox_and_message.Contains( t => t.Text ==String.Empty)

【讨论】:

    【解决方案5】:

    有几个解决方案:

    解决方案 1: 在 for 循环之后执行一个 for 循环来检查 true_or_false 是否包含 false,如下所示:

    如果您想在没有花哨的情况下实现这一目标,并且您想自己编写代码,您可以这样做:

    bool containsFalse = false;
    for(int j = 0; j < true_or_false.Length; j++)
    {
       //if the current element the array is equals to false, then containsFalse is true,
       //then exit for loop
       if(true_or_false[j] == false){
           containsFalse = true;
           break;
       }
    }
    
    if(containsFalse) {
      //your true_or_false array contains a false then.
    }
    

    解决方案 2:

    !true_or_false.All(x => x);
    

    PK

    【讨论】:

    • == false== true 需要死。否则一个很好的答案+1。
    • 如果您使用true_or_false.Any(x =&gt; !x),您的第二个解决方案会表现得更好
    • @nasufara:你有什么证据支持这个说法? AnyAll 都是短路的。如果有的话,只需调用一次 !(布尔 NOT)运算符应该会使 All 更快,但几乎可以肯定差异太小而无法衡量。
    • @Pavan:您可以通过在 if 中添加 break; 来使方法 #1 更快,因为您不需要继续查找第一个错误。
    • 非常感谢大家。 @Billy 我做了更改。和@ben,是的,没错。我已经做出了改变。再次感谢您
    【解决方案6】:

    如果在 .NET3.5+ 上您可以使用System.Linq,然后使用Any 进行检查:

    // if it contains any false element it will return true
    true_or_false.Any(x => !x); // !false == true
    

    如果您不能使用 Linq,那么您还有其他选择:

    使用Array.Exists 静态方法:(正如本所说)

    Array.Exists(true_or_false, x => !x);
    

    使用List.Exists(您必须将数组转换为列表才能访问此方法)

    true_or_falseList.Exists(x => !x);
    

    或者你需要遍历数组。

    foreach (bool b in true_or_false)
    {
        if (!b) return true; // if b is false return true (it contains a 'false' element)
    }
    return false; // didn't find a 'false' element
    

    相关


    并优化您的代码:

    bool[] true_or_false = new bool[10];
    
    for (int i = 0; i < txtbox_and_message.Length; i++)
    {
        true_or_false[i] = !String.IsNullOrEmpty(txtbox_and_message[i]);
    }
    

    【讨论】:

    • 你为什么选择List.Exists而不是Array.Exists
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2021-05-27
    • 2017-03-10
    • 2021-10-30
    • 1970-01-01
    • 2020-10-10
    • 2016-10-13
    相关资源
    最近更新 更多