我想声明如下:
var block = blocksById.FirstOrDefault(X => X.Value == tracResult.ID).Key
我的问题是如果我有 FirstOrDefault 空值,如何更正确地处理它。
我只是觉得 if
语句不是唯一可以在这里的解决方案...
最佳答案
自从引入 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
的):
var block = blocksById.Where(x => x.Value == tracResult.ID)
.Select(x => (int?) x.Key)
.FirstOrDefault() ?? somedefaultvalue;
更新:有些人似乎怀疑这是一个有效的用例,并争辩说 null 检查必须稍后在程序中完成。
虽然在很多情况下都是这种情况,但 is 并不总是为真,或者如果是,这种方式可能更方便。
一些例子:
//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"};
关于c# - 从 FirstOrDefault 中选择一个属性,以防 FirstOrDefault 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19947464/