首页 > 解决方案 > 搜索空白字段时出现字符串比较错误

问题描述

在电子表格中搜索一列时,我注意到第二行在遇到空白字段时会出现异常(“可空对象必须有一个值。”),但第一行会成功。我必须将Bool演员表添加到第二行,否则我会得到“无法将 Nullable<bool> 转换为 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));

标签: c#excelepplus

解决方案


这里发生的情况是,如果运算符的左侧是 ,则?.运算符将立即返回。nullnull

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

没有强制转换,第二行将不起作用,因为如果值为null,则?.运算符返回null并且该行的其余部分被忽略(.ToString()从不调用)。因此,您得到的异常是由于if条件必须返回 a bool,但它返回的是 a 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,它允许一个或多个null参数。这将包括结果 where (并且对于那些也cell.Value == null将返回 true 的情况):field.Keynull

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

推荐阅读