C# 引用不包含';不存在
尝试使用linq访问不存在的XML元素时,我收到以下错误: “System.NullReferenceException”类型的第一次意外异常 在Test.exe System.NullReferenceException中发生:对象引用 未设置为对象的实例 我可以通过简单地使用C# 引用不包含';不存在,c#,xml,linq,C#,Xml,Linq,尝试使用linq访问不存在的XML元素时,我收到以下错误: “System.NullReferenceException”类型的第一次意外异常 在Test.exe System.NullReferenceException中发生:对象引用 未设置为对象的实例 我可以通过简单地使用.Where(x=>thiskyword.Contains((string)x)) 但是我需要将thisKeyword和XML元素值(如果存在)转换为大写,以获得不区分大小写的比较 我的印象是,??“~”的意思是“如果左
.Where(x=>thiskyword.Contains((string)x))
但是我需要将thisKeyword
和XML元素值(如果存在)转换为大写,以获得不区分大小写的比较
我的印象是,??“~”
的意思是“如果左边的是空的,那么使用右边的。因此在这种情况下,x
应该变成波浪形,因此不能根据thisKeyword
进行验证(因为它永远不会包含波浪形)。我同意这是一种粗糙的方法……但它甚至不起作用
如何防止NullReferenceException?假设
x.Value
为null,并且thisKeyword
已知为非null:
.Where(x => thisKeyword.ToUpper().Contains(
(string)x.Value?.ToUpper() ?? "~")
.Where(x => x.Value != null)
.Where(x => thisKeyword.ToUpper().Contains(x.Value.ToUpper())
之所以发生崩溃,是因为?
运算符试图检查ToUpper()
返回的值是否为null。但是,它无法调用ToUpper()
,因为x.value
不存在
在C#version 6或更高版本中,您可以使用null传播运算符?。
,当且仅当对象为非null时,该运算符才能访问属性:
.Where(x => thisKeyword.ToUpper().Contains(
(string)x.Value?.ToUpper() ?? "~")
.Where(x => x.Value != null)
.Where(x => thisKeyword.ToUpper().Contains(x.Value.ToUpper())
或者,只需使用单独的Where
子句检查x.Value
是否为非空:
.Where(x => thisKeyword.ToUpper().Contains(
(string)x.Value?.ToUpper() ?? "~")
.Where(x => x.Value != null)
.Where(x => thisKeyword.ToUpper().Contains(x.Value.ToUpper())
另外,您可以将条件放在Any()
子句中:
.Elements("Exclusion")
.Any(x => x.Value != null && thisKeyword.ToUpper().Contains(x.Value.ToUpper())
您也不一定需要转换为大写:
.Any(x => x.Value != null &&
thisKeyword.IndexOf(x.Value,
StringComparison.InvariantCultureIgnoreCase) > 0)
查看什么是null、thisKeyword、x或x.Value的可能重复项将杀死您。必须首先执行null检查。我认为您可以使用以下代码
thisKeyword?.ToUpper()。包含((字符串)x?.Value.ToUpper()?“~”)
要检查两者是否都为空,您的思路是正确的,但您可以使用更简单的方法(静态方法)来代替Elvis运算符。静态方法允许为空,您可以指定不区分大小写的检查(这是人们在检查前执行ToUpper()或ToLower()的最常见原因)。谢谢。看起来我无法使用Value?.property,所以我必须使用C#的旧版本。我的下一个问题是,如果XML中不存在.Elements(“排除”)和.Element(“排除”),我应该如何处理NullReferenceException?