这是我的代码
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)
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)
只需使用问号技巧进行空检查:
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)