c# - 搜索空白字段时出现字符串比较错误
问题描述
在电子表格中搜索一列时,我注意到第二行在遇到空白字段时会出现异常(“可空对象必须有一个值。”),但第一行会成功。我必须将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));
解决方案
这里发生的情况是,如果运算符的左侧是 ,则?.
运算符将立即返回。null
null
因此,当cell.Value
is时null
,第一行有效,因为您正在使用==
运算符进行直接比较,这将返回 a bool
。换句话说,null == field.Key
返回false
(当然,除非field.Key
is 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.Key
null
keyFoundCell = _ws.Cells["a:a"].FirstOrDefault(cell =>
string.Equals(cell.Value?.ToString(), field.Key, StringComparison.OrdinalIgnoreCase));
推荐阅读
- javascript - 有人可以用javascript解释我这个箭头函数吗?
- javascript - “无法读取未定义的属性‘indexOf’”
- powerbi - Dax 衡量标准:每周统计独特的文章
- c# - Unity:从大图到地图/地形/纹理
- c# - 错误:未找到 .NETFramework,Version=v5.0 的参考程序集
- php - Laravel 不读取刀片语法中的数组索引
- javascript - 在打字稿泛型中,“=”运算符的用途是什么
- python - 使用现有 DataFrame 创建匹配表的最佳方法
- discord - 如何让命令提示符在启动时运行 discord bot
- python - 即使输入正确答案,程序也不返回“正确”