在列表中搜索时如何避免空引用异常
How to avoid Nullreference exception when searching in List
我正在尝试获取包含特定字符串的列表项,我正在使用此代码:
string myListLine= myList.FirstOrDefault(stringToCheck => stringToCheck.Contains("mystring "));
一切正常,但如果列表不包含特定字符串,则会抛出错误:
object reference not set to an instance of an object
我认为我应该以某种方式验证字符串是否首先存在,但不确定什么是最好的方法。
您可以使用 safe navigation operator and the null-coalescing operator 来解决这个问题:
System.Collections.Generic.List<string> myList = new System.Collections.Generic.List<string> { null, "Test123" };
string myListLine = myList.FirstOrDefault(stringToCheck => stringToCheck?.Contains("mystring ") ?? false);
如果您在 null
列表条目上调用方法,则会出现此问题。
注意:如果列表为空FirstOrDefault
returns null.
希望对您有所帮助。
if the list does not contain a particular string it throws an error:
这是不正确的。抛出异常,因为您的列表中有一个 null
值!如果列表中的所有项目都是有效字符串,则不会抛出异常。在这种情况下 FirstOrDefault
将简单地 return null
.
I think that I should somehow validate if the string first exists
您可以先用 oldscool 方法检查它是否为空,然后将其与逻辑 AND &&
和 Contains
方法
结合起来
string myListLine= myList.FirstOrDefault(stringToCheck =>
stringToCheck != null && stringToCheck.Contains("mystring "));
这样,如果第一个条件的计算结果为 FALSE
,则不会计算第二个 Contains
您的代码简单地遍历 myList
,对于每个项目,它检查它是否包含 "mystring "
。
只有当 运行 该行是您的列表 myList
为空时,您可能会得到空引用的唯一原因。如果它是空的,它不会得到任何错误。
如果您在该行之后得到空引用,则意味着 myListLine
为空,这意味着 myList
不包含任何与 "mystring "
匹配的项目。
为确保您不会收到 myListLine
的空引用错误,您应该在使用类似这样的方法访问它之前检查它是否为空;
if( myListLine != null ){
<Do something to myListLine>
} else {
<list doesnt contain the correct string, alert user.>
}
我认为我的这个示例代码是访问 myList
对象的最安全的方法之一。如果它为空,则 return 指示未找到值或为空。
List<string> myList = new List<string>()
{
"name","adress","phoneNumber"
};
myList.RemoveAll(item => item == null);
string myListLine = myList.FirstOrDefault(stringToCheck => stringToCheck.Contains("myString")) ?? "Not found/Empty";
变体:
var myList = new List<string>(){"foo","Bar", null,"the mystring"};
string myListLine = myList.FirstOrDefault(s => s == null? false : s.Contains("mystring"));
与已经提到的关于 FirstOrDefault
的注释相同 null
如果空列表 或 不匹配( 不是 Contains
)
我正在尝试获取包含特定字符串的列表项,我正在使用此代码:
string myListLine= myList.FirstOrDefault(stringToCheck => stringToCheck.Contains("mystring "));
一切正常,但如果列表不包含特定字符串,则会抛出错误:
object reference not set to an instance of an object
我认为我应该以某种方式验证字符串是否首先存在,但不确定什么是最好的方法。
您可以使用 safe navigation operator and the null-coalescing operator 来解决这个问题:
System.Collections.Generic.List<string> myList = new System.Collections.Generic.List<string> { null, "Test123" };
string myListLine = myList.FirstOrDefault(stringToCheck => stringToCheck?.Contains("mystring ") ?? false);
如果您在 null
列表条目上调用方法,则会出现此问题。
注意:如果列表为空FirstOrDefault
returns null.
希望对您有所帮助。
if the list does not contain a particular string it throws an error:
这是不正确的。抛出异常,因为您的列表中有一个 null
值!如果列表中的所有项目都是有效字符串,则不会抛出异常。在这种情况下 FirstOrDefault
将简单地 return null
.
I think that I should somehow validate if the string first exists
您可以先用 oldscool 方法检查它是否为空,然后将其与逻辑 AND &&
和 Contains
方法
string myListLine= myList.FirstOrDefault(stringToCheck =>
stringToCheck != null && stringToCheck.Contains("mystring "));
这样,如果第一个条件的计算结果为 FALSE
Contains
您的代码简单地遍历 myList
,对于每个项目,它检查它是否包含 "mystring "
。
只有当 运行 该行是您的列表 myList
为空时,您可能会得到空引用的唯一原因。如果它是空的,它不会得到任何错误。
如果您在该行之后得到空引用,则意味着 myListLine
为空,这意味着 myList
不包含任何与 "mystring "
匹配的项目。
为确保您不会收到 myListLine
的空引用错误,您应该在使用类似这样的方法访问它之前检查它是否为空;
if( myListLine != null ){
<Do something to myListLine>
} else {
<list doesnt contain the correct string, alert user.>
}
我认为我的这个示例代码是访问 myList
对象的最安全的方法之一。如果它为空,则 return 指示未找到值或为空。
List<string> myList = new List<string>()
{
"name","adress","phoneNumber"
};
myList.RemoveAll(item => item == null);
string myListLine = myList.FirstOrDefault(stringToCheck => stringToCheck.Contains("myString")) ?? "Not found/Empty";
变体:
var myList = new List<string>(){"foo","Bar", null,"the mystring"};
string myListLine = myList.FirstOrDefault(s => s == null? false : s.Contains("mystring"));
与已经提到的关于 FirstOrDefault
的注释相同 null
如果空列表 或 不匹配( 不是 Contains
)