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

我想发表以下声明:
var block = blocksById.FirstOrDefault(X => X.Value == tracResult.ID).Key

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

解决方法

将它拆分为Where和Select:
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"};

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...