c# - 从 FirstOrDefault 中选择一个属性,以防 FirstOrDefault 返回 null

标签 c# .net linq

我想声明如下:

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语句,以下仍然有效...


前段时间...

将其拆分为 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 检查必须稍后在程序中完成。

虽然在很多情况下都是这种情况,但 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/

相关文章:

c# - .NET 正则表达式 - 创建字符串?

c# - 我是否需要在 .NET 中显式调整堆栈大小?

c# - 使用 Linq 删除同一对象中的子项的父项

c# - 使用 linq 检查列表计数是否一致

c# - 使用 C# 控制 cmd.exe(发送和读取输出)

c# - 比较两个 DataGridView 之间的单元格

c# - 通过 C# 使用 GPU

C#逻辑内存配置 View

c# - 我试图理解我反射(reflect)过的微软的 Do​​ubleUtil.AreClose() 代码

mysql - 在 linq 中返回消息