【问题标题】:selecting a property from FirstOrDefault in case FirstOrDefault returns null从 FirstOrDefault 中选择一个属性,以防 FirstOrDefault 返回 null
【发布时间】:2019-03-01 23:42:58
【问题描述】:

我想发表以下声明:

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

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

【问题讨论】:

  • 当您使用FirstOrDefault 时,您期望返回的值可以为空。因此,在您执行.key 之前,您应该检查null 的返回值。如果这种情况下的空值是意外的,您应该使用First() 并处理空引用异常
  • FirstOrDefault 的意思是你没有得到结果然后空值将被淘汰。如果或条件运算符是这样做的唯一方法..

标签: c# .net linq


【解决方案1】:

自从引入null conditional operators (?),就这么简单:

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

请记住,在这种情况下,即使 Valueintblock 的类型也将是 Nullable<int>,因此可以是 null

但是,如果您想在返回 null 时分配默认值,您可以这样使用 null coalescing operator (??)

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

不过,对于更复杂的 Select 语句,以下语句仍然有效...


前段时间……

拆分成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'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"};

【讨论】:

  • 如果我的 Key 是 int 就无法使用??运算符。
  • @NightWalker: True,那么 FirstOrDefault 将恢复为default(int),即0。您可以跳过 ?? 运算符部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多