Ошибка ввода строки в неправильном формате при подсчете со столбцом только нулевых значений - PullRequest
0 голосов
/ 26 апреля 2019

Я считаю некоторые значения типа int (1, 2, 3 или 4) в определенных столбцах datatable.В столбце могут содержаться только значения от 1 до 9 (исключительные) или ноль.

Например, типичный столбец с 10 записями будет выглядеть следующим образом:

Level
  1
  2
  1
  4
  3
  7
  3
  3
(null)
  9

Это отлично работаетнесмотря на нулевое значение.Пока существует ненулевое значение, мой код работает.

Код завершается ошибкой, когда в столбце содержатся только нулевые значения, однако это может произойти, когда я извлекаю эти данные из базы данных и в зависимости отусловия, все результаты могут быть нулевыми.

Я использую код, показанный ниже, чтобы сделать этот счет.Я посмотрел на этот вопрос: Входная строка была не в правильном формате , но я не уверен в способе использования TryParse() в этом контексте.

int countnum = tab2table.AsEnumerable().Where(x => int.Parse(x["Level"].ToString()) == 1 || int.Parse(x["Level"].ToString()) == 2 ||
                                                    int.Parse(x["Level"].ToString()) == 3 || int.Parse(x["Level"].ToString()) == 4).ToList().Count;

Для примера Level столбец, показанный выше, countnum должен быть равен 7. Когда весь столбец равен нулю countnum должен быть равен 0.

Как это можно изменить, чтобы работать, даже когда весь столбец равен нулю?Я полагаю, если бы был способ проверить, является ли столбец нулевым, я мог бы поместить это в оператор if, но я не нашел способа сделать это.

1 Ответ

1 голос
/ 26 апреля 2019

Вы можете попробовать что-то вроде этого:

int countnum = tab2table.AsEnumerable()
     .Select(x => int.TryParse(x["Level"].ToString(), out var d) ? d : (int?)null)
     .Where(x => x >= 1 && x <= 4)
     .Count();

Использование TryParse позволяет избежать проблемы с нулевыми значениями (или другими нецелыми значениями).Если x["Level"] равно нулю (или DBNull), то выбранное значение будет равно нулю.Используя Select, за которым следует Where, вы также избегаете потенциального синтаксического анализа ваших целых чисел 4 раза, что довольно неэффективно, и, поскольку вы теперь имеете дело со значениями типа null, все нули всегда возвращают false в предложении where, заставляя ихбыть пропущен.

Если значения в вашей таблице данных на самом деле int, тогда вы можете просто проверить DBNull и привести ваши датированные ячейки к int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...