如果FirstOrDefault返回null,则从FirstOrDefault中选择一个属性

我想发表以下声明:

var block = blocksById.FirstOrDefault(X => X.Value == tracResult.ID).Key 

我的问题是如果我有FirstOrDefault null值,如何更正确地处理它。 我只是不觉得if声明是可以在这里的唯一解决方案…

将它拆分为WhereSelect

 var block = blocksById.Where(x => x.Value == tracResult.ID) .Select(x => x.Key) .FirstOrDefault(); 

这样,如果FirstOrDefault返回null您将不会获得NullRefferenceException。

另外你可以给它一个默认值,如下所示:

 var block = blocksById.Where(x => x.Value == tracResult.ID) .Select(x => x.Key) .FirstOrDefault() ?? somedefaultvalue; 

或者正如@Silvermind所说的非可空类到可空类型( int的):

 var block = blocksById.Where(x => x.Value == tracResult.ID) .Select(x => (int?) x.Key) .FirstOrDefault() ?? somedefaultvalue; 

更新:有些人似乎怀疑这是一个有效的用例,并认为必须在程序中稍后进行null检查。

虽然在很多情况下都是如此,但并不总是必须如此,或者如果是这样的话,这种方式可能会更方便。

一些例子:

 //one liner, null check delegated (not my favorite): return SomeCalculatedValue(collection.Where(condition).Select(selection).FirstOrDefault()); //or a mapping (shown with default value): var result = collection.Where(condition) .Select(c => { Foo = c.Foo, Bar = c.Bar }).FirstOrDefault()) ?? new { Foo = "New", Bar = "Empty"};