Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 引用不包含';不存在_C#_Xml_Linq - Fatal编程技术网

C# 引用不包含';不存在

C# 引用不包含';不存在,c#,xml,linq,C#,Xml,Linq,尝试使用linq访问不存在的XML元素时,我收到以下错误: “System.NullReferenceException”类型的第一次意外异常 在Test.exe System.NullReferenceException中发生:对象引用 未设置为对象的实例 我可以通过简单地使用.Where(x=>thiskyword.Contains((string)x)) 但是我需要将thisKeyword和XML元素值(如果存在)转换为大写,以获得不区分大小写的比较 我的印象是,??“~”的意思是“如果左

尝试使用linq访问不存在的XML元素时,我收到以下错误:

“System.NullReferenceException”类型的第一次意外异常 在Test.exe System.NullReferenceException中发生:对象引用 未设置为对象的实例

我可以通过简单地使用
.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?