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

时间:2013-11-13 07:05:18

标签: c# .net linq

我想发表以下声明:

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

我的问题是如果我有FirstOrDefault null值,如何更正确地处理它。 我只是觉得if个定法是唯一可以解决的问题......

1 个答案:

答案 0 :(得分:20)

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):

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"};