这是我的代码
string displayName = Dictionary.FirstOrDefault(x =>x.Value.ID== long.Parse(options.ID)).Value.DisplayName;
如果x.Value.ID与options.ID匹配,则代码可以正常工作。但是如果没有,我会得到一个nullreferenceexception。
答案 0 :(得分:61)
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;
}
但是如果要搜索值,字典的关键是什么? 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
答案 1 :(得分:10)
您可以使用其他LINQ方法的组合来处理不匹配的条件:
var res = dictionary.Where(x => x.Value.ID == someID)
.Select(x => x.Value.DisplayName)
.DefaultIfEmpty("Unknown")
.First();
答案 2 :(得分:2)
这是因为FirstOrDefault
可以返回null
,导致您的后续.Value
导致异常。您需要将其更改为:
var myThing = things.FirstOrDefault(t => t.Id == idToFind);
if(myThing == null)
return; // we failed to find what we wanted
var displayName = myThing.DisplayName;
答案 3 :(得分:1)
简单地使用问号技巧进行空检查:
string displayName = Dictionary.FirstOrDefault(x => x.Value.ID == long.Parse(options.ID))?.Value.DisplayName ?? "DEFINE A DEFAULT DISPLAY NAME HERE";
答案 4 :(得分:0)
我假设你正在使用可以为空的数据类型,你可以这样做:
var t = things.Where(x => x!=null && x.Value.ID == long.Parse(options.ID)).FirstOrDefault();
var res = t == null ? "" : t.Value;
答案 5 :(得分:0)
要添加到解决方案,这里有一个可能有帮助的LINQ语句
Utilities.DIMENSION_MemTbl.Where(a => a.DIMENSION_ID == format.ContentBrief.DimensionID).Select(a=>a.DIMENSION1).DefaultIfEmpty("").FirstOrDefault();
如果查询结果为null,则结果为空字符串。
答案 6 :(得分:0)
这个答案适用于我们这些需要视觉写作的人(像我一样:)
在下面的代码截图中,会抛出一个 NullReferenceException
,根本原因是 ReferenceIdentification_02
属性。
调试时,我们看到我查询的orderLine.REF
数组不包含ReferenceIdentificationQualifier_01
值== "RU"
的匹配对象,因此此时FirstOrDefault()
返回值是 NULL
为了防止 NullReferenceException
,我首先在 FirstOrDefault()
数组上执行 orderLine.REF
。如果返回的值不是 null
,则我检索该值。
答案 7 :(得分:-1)
您可以将“Where”语句与 FirstOrDefault()
一起使用。
像这样。
var modelItem = _dbcontext.ModelName.Where(n => n.NewsTagId == newsTag.Id).FirstOrDefault();
如果与查询不匹配,则返回第一项。 更好的做法是在查询后检查 NULL。
if(modelItem == null)
{
return "Not Found."
}
else
{
// continue process
}