在列表中搜索时如何避免空引用异常

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)