我想发表以下声明:
var block = blocksById.FirstOrDefault(X => X.Value == tracResult.ID).Key
Run Code Online (Sandbox Code Playgroud)
我的问题是如果我有FirstOrDefault null值,如何更正确地处理它.我只是不觉得这些if声明是可以在这里找到的唯一解决方案......
Ste*_*fan 20
自从引入空条件运算符(?)以来,它就像:
var block = blocksById.FirstOrDefault(X => X.Value == tracResult.ID)?.Key;
Run Code Online (Sandbox Code Playgroud)
请记住,在这种情况下,即使Value是一个int,block也将是类型Nullable<int>,因此,可以null.
但是,如果要null返回默认值,如果返回,则可以使用null合并运算符(??)这样:
var block = blocksById.FirstOrDefault(X => X.Value == tracResult.ID)?.Key ?? 6;
Run Code Online (Sandbox Code Playgroud)
然而,对于更复杂的Select陈述,以下内容仍然有效......
拆分Where和Select:
var block = blocksById.Where(x => x.Value == tracResult.ID)
.Select(x => x.Key)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
这样,如果FirstOrDefault返回,您将不会获得NullRefferenceException null.
另外你可以给它一个默认值,如下所示:
var block = blocksById.Where(x => x.Value == tracResult.ID)
.Select(x => x.Key)
.FirstOrDefault() ?? somedefaultvalue;
Run Code Online (Sandbox Code Playgroud)
或者正如@Silvermind所述,对于不可为空的可空类型(int's):
var block = blocksById.Where(x => x.Value == tracResult.ID)
.Select(x => (int?) x.Key)
.FirstOrDefault() ?? somedefaultvalue;
Run Code Online (Sandbox Code Playgroud)
更新:有些人似乎怀疑这是一个有效的用例,并认为必须在程序中稍后进行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"};
Run Code Online (Sandbox Code Playgroud)