Ошибка сравнения строк при поиске пустых полей - PullRequest
0 голосов
/ 13 мая 2019

Поиск по столбцу в электронной таблице. Я замечаю, что вторая строка будет исключением («Обнуляемый объект должен иметь значение.»), Когда он сталкивается с пустым полем, однако первая строка будет успешной.Я должен добавить приведение Bool ко второй строке, потому что в противном случае я получаю «Невозможно преобразовать Nullable в bool».Я предполагаю, что это проблема, но есть ли способ обойти пустые поля для проверки?

keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell => cell.Value?.ToString() == field.Key);
keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell => (bool)cell.Value?.ToString().Equals(field.Key, StringComparison.OrdinalIgnoreCase));

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Здесь происходит то, что оператор ?. сразу вернет null, если левая часть оператора имеет значение null.

Итак, когда cell.Value равно null,первая строка работает, потому что вы делаете прямое сравнение, используя оператор ==, который вернет bool.Другими словами, null == field.Key возвращает false (если, конечно, field.Key не равен null).

Вторая строка не работает без преобразования, потому что если значение равно null, тооператор ?. возвращает null, а остальная часть строки игнорируется (.ToString() никогда не вызывается).Таким образом, исключение, которое вы получаете, связано с тем, что условие if должно возвращать bool, но вместо этого оно возвращает Nullable<bool>.

Один из способов исправить это - просто проверитьnull первый.Это не будет сравнивать объекты, где cell.Value == null:

keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell => 
    cell.Value != null && 
    cell.Value.ToString().Equals(field.Key, StringComparison.OrdinalIgnoreCase));

Еще один способ сделать это - использовать статический метод Equals класса string, который позволит один или несколько * 1032.* аргументы.Это будет включать результаты, где cell.Value == null (и будет возвращать true для тех случаев, когда field.Key также null):

keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell => 
    string.Equals(cell.Value?.ToString(), field.Key, StringComparison.OrdinalIgnoreCase));
1 голос
/ 13 мая 2019

В EPPlus и Excel Interop вы можете прочитать содержимое ячейки, используя свойство Text вместо свойства Value, если вы хотите работать с видимым содержимым ячейки и избегать нулевых значений. Value возвращает object, который может быть нулевым, но Text возвращает видимый текст как string, который может быть пустым, но не будет нулевым.

Если мы используем Value.ToString() или Value?.ToString(), то, скорее всего, нам будет лучше с Text, потому что это дешевая распродажа, в которой нам нужен текст, который мы видим, а не значение.

0 голосов
/ 13 мая 2019

может быть попробовать:

keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell => (bool?)cell.Value?.ToString().Equals(field.Key, StringComparison.OrdinalIgnoreCase)) ?? false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...