搜索空白字段时出现字符串比较错误

String Comparison Error when Searching Blank Fields

搜索电子表格中的一列时,我注意到第二行在遇到空白字段时会出现异常 ("Nullable object must have a value."),但第一行会成功。我必须将 Bool 添加到第二行,否则我会得到 "Cannot convert Nullable<bool> to 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));

也许试试:

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

这里发生的是,如果运算符的左侧是 null.

?. 运算符将立即 return null

因此,当 cell.Valuenull 时,第一行有效,因为您正在使用 == 运算符进行直接比较,这将 return bool。换句话说,null == field.Keyreturns false(当然,除非field.Keynull)。

如果没有转换,第二行将无法工作,因为如果值为 null,则 ?. 运算符 returns null 和该行的其余部分被忽略(.ToString() 永远不会被调用)。所以你得到的异常是由于 if 条件必须 return 一个 bool,但它是 returning 一个 Nullable<bool>

解决此问题的一种方法是先检查 null。这不会比较 cell.Value == null:

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

另一种方法是使用 string class 的静态 Equals 方法,这将允许一个或多个 null 参数。这将包括 cell.Value == null 的结果(对于 field.Key 也是 null 的情况 return 为真):

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

在 EPPlus 和 Excel Interop 中,如果需要,您可以使用 Text 属性 而不是 Value 属性 来读取单元格的内容对单元格的可见内容进行操作并避免空值。 Value returns 可能为空的 object,但 Text returns 可见文本作为 string 可以为空但不会为空。

如果我们使用 Value.ToString()Value?.ToString() 那么使用 Text 可能会更好,因为这是我们想要看到的文本的赠品,而不是价值。