【问题标题】:Checking element values in a Boolean array - C#检查布尔数组中的元素值 - C#
【发布时间】:2011-01-24 07:50:17
【问题描述】:

我正在编写一些错误检查并尝试使用布尔数组在元素中存储真或假,然后我的最终条件解析存储的元素以确定它在 Visual Studio 2008 中是否全部为真。可能有一种更简单的错误检查方法,但不妨学习如何利用数组。这是我到目前为止所拥有的

bool[] checker = new bool[1]; // declared array...I think

private void print_button_Click(object sender, EventArgs e)
{
  if (authorbox.Text == "")
  {
    MessageBox.Show("Author field empty", "Required Entry");
  }
  else
  {
    checker[0] = true; // assigning element to array correctly?
  }

  if (titlebox.Text == "")
  {
    MessageBox.Show("Title field Empty", "Required Entry");
  }
  else
  {
    checker[1] = true;
  }

  // The part I am having trouble with basically if any of my array elements are  
  // false don't execute printing. Else go ahead and print.
  if ()
  {
  }
  else 
  {
    printPreviewDialog1.Document = printDocument1;
    printPreviewDialog1.ShowDialog();
  }
}

【问题讨论】:

  • checker[1] = true; 将抛出越界错误:您的数组只有一个元素 (bool[1]),该元素位于索引 0 处(C# 数组索引从 0 开始)。我认为您的意思是 checker 是一个二元素数组,即 bool[] checker = new bool[2];
  • 您的代码有错误。如果您声明一个数组有 1 个索引(新布尔 [1])...它不能有一个检查器 [1]。 [] 中的数字是数组元素的计数或总数。引用它们的实际索引值将从零开始。所以你需要做 bool[] checker = new bool[2];能够做 checker[0] 和 checker[1]

标签: c# arrays boolean


【解决方案1】:

与其使用数组,不如在检测到错误后立即退出该方法会容易得多:

private void print_button_Click(object sender, EventArgs e) {
  if (authorbox.Text == "") {
    MessageBox.Show("Author field empty", "Required Entry");
    return;
  }

  if (titlebox.Text == "") {
    MessageBox.Show("Title field Empty", "Required Entry");
    return;
  }

  printPreviewDialog1.Document = printDocument1;
  printPreviewDialog1.ShowDialog();
}

【讨论】:

  • 检测到第一个错误后立即退出会导致可用性问题。如果作者和标题都是强制性的,并且两者都缺失,您应该告诉用户。否则,用户修复了一个错误,却被告知“哦,但还有另一个错误我没有告诉你”。 (诚​​然,原始代码的多个消息框序列的可用性也很差,但至少它为用户提供了他们需要的所有信息。)
  • 弹出 10 个消息框会很烦人。可能最好简单地切换到使用错误提供程序(并按需禁用按钮)或至少收集列表中的错误消息并将它们显示在单个消息框中......无论如何,我不会在任一解决方案中使用 bool 数组.
【解决方案2】:

使用布尔数组来累积单个 go/no-go 值是矫枉过正的。您可以使用更多有用的东西来掌握数组的窍门。

你最好简单地将中间检查的结果与一个值相结合,然后检查它的真/假:

public bool CheckControls()
{
    bool pass = true;
    pass &= !string.IsNullOrEmpty(authorbox.Text));
    pass &= !string.IsNullOrEmpty(titlebox.Text));
    // if any of these are empty then pass is to false and stays that way.
    return pass;
}

如果您需要跟踪哪个中间测试失败,请考虑使用整数和预定义的 2 次幂常数。如果一切正常,您可以在这里检查零。这允许您屏蔽返回的值并累积测试结果的任何组合。只要您的测试少于 32 个(或 64 个)。

    int AUTHORBOX = 2;
    int TITLEBOX = 4;
    int ISBNBOX = 8;
    int PRICEBOX = 16;

    public int AlternateCheck()
    {
        int temp = 0;
        temp += string.IsNullOrEmpty(authorbox.Text) ? AUTHORBOX : 0;
        temp += string.IsNullOrEmpty(titlebox.Text) ? TITLEBOX : 0;
        temp += string.IsNullOrEmpty(isbnbox.Text) ? ISBNBOX : 0;
        temp += string.IsNullOrEmpty(pricebox.Text) ? PRICEBOX : 0;
        return temp;
    }

【讨论】:

    【解决方案3】:

    如果您使用的是 .NET 3.5,您可以使用 Any 和 All 来查看任何布尔值是否为真,或者它们是否都为真:

    if (checker.Any(x => x))
    

    或:

    if (checker.All(x => x))
    

    另外,如果你想要一个包含两个布尔值的数组,你应该使用new bool[2] 而不是new bool[1]。不过使用List<bool> 会更容易。

    【讨论】:

    • 如果 .NET 3.5 可用,这将是我的首选方式,如果只是为了完美简洁。
    • 我意识到有效/逻辑上这将完成与Contains(x) 相同的事情,但对我来说似乎有点迂回。本质上,这些方法将做的是枚举checker 并评估if ((checker[i] == true) == true)...
    【解决方案4】:

    我很确定 NebuSoft 建议的 Contains 方法是一个 LINQ 扩展,因此在 .NET 2.0 中不可用。但是,您可以使用 Array.IndexOf<T> 方法,如下所示:

    if (Array.IndexOf<bool>(checker, false) != -1)
    {
        // some element in the array is false
    }
    else
    {
        // no false in the array
    }
    

    但是,NebuSoft 断言这不是最佳方法是正确的。如果您想了解更多信息,我很乐意进一步讨论。

    【讨论】:

    • 完全正确。在使用 VS 2008 时,我倾向于假设 3.5,但情况并非总是如此。 :)
    • List.Contains 与 LINQ 无关,在 .NET 框架的 2.0 以上版本中可用。
    • 但 bool[].Contains 与 LINQ 相关。
    【解决方案5】:

    除此之外,你应该说

      bool[] checker = new bool[2];
    

    如果你想要一个由 2 个元素组成的数组 ;) 在这种特殊情况下,数组似乎没有太大意义,因为它有点混淆了事物。你可以只用一个布尔变量来做同样的事情。

    【讨论】:

      【解决方案6】:

      这不是错误处理的理想方式,但您可以使用 .Contains() 方法。

      if (checker.Contains(false))
      {
         // Do Something
      }
      else 
      {
         printPreviewDialog1.Document = printDocument1;
         printPreviewDialog1.ShowDialog();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 2015-01-07
        • 2013-09-09
        • 2021-11-04
        • 2013-04-25
        • 1970-01-01
        相关资源
        最近更新 更多