我正在尝试获取包含特定字符串的列表项,我正在使用此代码:
string myListLine= myList.FirstOrDefault(stringToCheck => stringToCheck.Contains("mystring "));
一切正常,但如果列表中不包含特定字符串,则会抛出错误:
对象引用未设置为对象的实例
我认为我应该以某种方式验证字符串是否首先存在但不确定最佳方法是什么。
答案 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 operator和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
,则返回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>