Проверка значений элементов в логическом массиве - C # - PullRequest
2 голосов
/ 06 марта 2010

Я пишу некоторую проверку ошибок и пытаюсь использовать логический массив для хранения значений true или false в элементах, а затем мое окончательное условие анализирует сохраненные элементы, чтобы определить, действительно ли все это верно в visual studio 2008. Возможно, Theres более простой способ проверки ошибок, но он также может научиться использовать массив. Вот что у меня пока

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();
  }
}

Ответы [ 6 ]

4 голосов
/ 06 марта 2010

Если вы используете .NET 3.5, вы можете использовать Any и All, чтобы узнать, являются ли какие-либо из логических значений истинными или все они истинны:

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

или:

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

Также, если вам нужен массив из двух логических значений, вы должны использовать new bool[2], а не new bool[1].Хотя было бы проще использовать List<bool>.

1 голос
/ 06 марта 2010

Использование логических массивов для накопления одного значения go / no-go является излишним. Есть и другие полезные вещи, с которыми вы можете поиграть, чтобы получить представление о массивах.

Вам лучше просто перевести результаты промежуточных проверок в значение, а затем проверить его на true / false:

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;
}

Если вам необходимо отслеживать, какой промежуточный тест не пройден, рассмотрите возможность использования целого числа и предопределенных констант степеней двух. Здесь вы вместо этого проверяете на ноль, если все хорошо. Это позволяет маскировать возвращаемое значение и накапливать любую комбинацию результатов теста. Пока у вас есть менее 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;
    }
1 голос
/ 06 марта 2010

вместо использования массива было бы намного проще просто выйти из метода, как только обнаружена ошибка:

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();
}
1 голос
/ 06 марта 2010

Помимо прочего, вы должны сказать

  bool[] checker = new bool[2];

, если вы хотите массив, состоящий из 2 элементов;) В данном конкретном случае массив, кажется, не имеет особого смысла, потому что он запутываетвещи немного.Вы можете сделать то же самое только с одной логической переменной.

1 голос
/ 06 марта 2010

Что ж, это не идеальный способ обработки ошибок, но вы можете использовать метод .Contains ().

if (checker.Contains(false))
{
   // Do Something
}
else 
{
   printPreviewDialog1.Document = printDocument1;
   printPreviewDialog1.ShowDialog();
}
0 голосов
/ 06 марта 2010

Я уверен, что метод Contains, предложенный NebuSoft, является расширением 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 прав, утверждая, что это не лучший подход. Если вам интересно узнать больше, я буду рад обсудить это дальше.

...