在List中搜索时如何避免Nullreference异常

时间:2017-11-23 07:17:23

标签: c# nullreferenceexception

我正在尝试获取包含特定字符串的列表项,我正在使用此代码:

string myListLine= myList.FirstOrDefault(stringToCheck => stringToCheck.Contains("mystring "));

一切正常,但如果列表中不包含特定字符串,则会抛出错误:

  

对象引用未设置为对象的实例

我认为我应该以某种方式验证字符串是否首先存在但不确定最佳方法是什么。

5 个答案:

答案 0 :(得分:4)

  

如果列表不包含特定字符串,则会抛出错误:

这是不正确的。抛出异常,因为列表中有null值!如果列表中的所有项都是有效字符串,则不会抛出任何异常。在这种情况下,FirstOrDefault只会返回null

  

我认为我应该以某种方式验证字符串是否首先存在

您可以先检查它是否为oldscool方式为null,并将其与带有&&方法的逻辑AND Contains合并

string myListLine= myList.FirstOrDefault(stringToCheck => 
           stringToCheck != null && stringToCheck.Contains("mystring "));

这样,如果第一个条件评估为Contains

,则不会评估第二个FALSE

答案 1 :(得分:1)

您可以使用safe navigation operatornull-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,则返回null。

希望有所帮助。

答案 2 :(得分:1)

您的代码只需通过myList,对于每个项目,它会检查它是否包含"mystring "

只有在运行该行时才能获得空引用的原因是列表myList为空。如果它是空的,它不会得到任何错误。

如果在该行之后得到空引用,则表示myListLine为空,这意味着myList不包含与"mystring "匹配的任何项目。

为了确保您没有使用myListLine获得空引用错误,您应该在使用类似的东西访问之前检查它是否为null;

if( myListLine != null ){
    <Do something to myListLine>
} else {
    <list doesnt contain the correct string, alert user.>
}

答案 3 :(得分:1)

我认为我的示例代码是访问myList对象最安全的方法之一。如果为null,则返回未找到值或空的指示符。

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";

答案 4 :(得分:1)

变体:

var myList = new List<string>(){"foo","Bar", null,"the mystring"};
string myListLine = myList.FirstOrDefault(s => s == null? false : s.Contains("mystring"));

如果空列表不匹配({em>不 FirstOrDefault),则null Contains已提及的相同注释< / p>