自从引入null conditional operators (?),就这么简单:
var block = blocksById.FirstOrDefault(X => X.Value == tracResult.ID)?.Key;
请记住,在这种情况下,即使 Value 是 int,block 的类型也将是 Nullable<int>,因此可以是 null。
但是,如果您想在返回 null 时分配默认值,您可以这样使用 null coalescing operator (??):
var block = blocksById.FirstOrDefault(X => X.Value == tracResult.ID)?.Key ?? 6;
不过,对于更复杂的 Select 语句,以下语句仍然有效...
前段时间……
拆分成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's):
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"};