搜索空白字段时出现字符串比较错误
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.Value
为 null
时,第一行有效,因为您正在使用 ==
运算符进行直接比较,这将 return bool
。换句话说,null == field.Key
returns false
(当然,除非field.Key
是null
)。
如果没有转换,第二行将无法工作,因为如果值为 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
可能会更好,因为这是我们想要看到的文本的赠品,而不是价值。
搜索电子表格中的一列时,我注意到第二行在遇到空白字段时会出现异常 ("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.Value
为 null
时,第一行有效,因为您正在使用 ==
运算符进行直接比较,这将 return bool
。换句话说,null == field.Key
returns false
(当然,除非field.Key
是null
)。
如果没有转换,第二行将无法工作,因为如果值为 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
可能会更好,因为这是我们想要看到的文本的赠品,而不是价值。