如果未找到匹配项,则FirstOrDefault返回NullReferenceException

Raz*_*ato 34 c# lambda

这是我的代码

string displayName = Dictionary.FirstOrDefault(x => x.Value.ID == long.Parse(options.ID)).Value.DisplayName;
Run Code Online (Sandbox Code Playgroud)

如果x.Value.ID匹配options.ID,则代码可以正常工作.但是如果没有,我会得到一个nullreferenceexception.

Tim*_*ter 66

FirstOrDefault如果没有项与谓词匹配,则返回类型的默认值.对于参考类型null.这就是例外的原因.

所以你必须首先检查null:

string displayName = null;
var keyValue = Dictionary
    .FirstOrDefault(x => x.Value.ID == long.Parse(options.ID));
if(keyValue  != null)
{
    displayName = keyValue.Value.DisplayName;
} 
Run Code Online (Sandbox Code Playgroud)

但是,如果要搜索值,字典的关键是什么?A Dictionary<tKey,TValue>用于通过键查找值.也许你应该重构它.

另一种选择是提供默认值DefaultIfEmpty:

string displayName = Dictionary
    .Where(kv => kv.Value.ID == long.Parse(options.ID))
    .Select(kv => kv.Value.DisplayName)   // not a problem even if no item matches
    .DefaultIfEmpty("--Option unknown--") // or no argument -> null
    .First();                             // cannot cause an exception
Run Code Online (Sandbox Code Playgroud)

  • 第一个解决方案不起作用。我遇到了同样的异常。第二个对我有用。谢谢。 (2认同)

Kon*_*osa 12

您可以使用其他LINQ方法的组合来处理不匹配的条件:

var res = dictionary.Where(x => x.Value.ID == someID)
                    .Select(x => x.Value.DisplayName)
                    .DefaultIfEmpty("Unknown")
                    .First();
Run Code Online (Sandbox Code Playgroud)


sɐu*_*qɐp 5

只需使用问号技巧进行空检查:

string displayName = Dictionary.FirstOrDefault(x => x.Value.ID == long.Parse(options.ID))?.Value.DisplayName ?? "DEFINE A DEFAULT DISPLAY NAME HERE";
Run Code Online (Sandbox Code Playgroud)