将剃刀页面中的Linq语句的空值检查压缩为1行

时间:2018-03-12 02:40:15

标签: c# linq

我在Razor页面中有一个带有IEnumerable接口的集合,其中包含可变数量的项目。

为了确保当项目数量低于5时,我不会尝试获得该系列中的第5项,我会收到如下支票:

@if (Model.MyItems.Count() > 5)
{
    @Model.MyItems.Skip(5).FirstOrDefault().Title
}

因此,如果集合中的项目少于5个,则不会尝试显示它。

有没有办法可以在一个Linq语句中完成所有这些 - 就像这样:

@Model.MyItems.Skip(5).FirstOrDefault().Title.ReturnIfExistsElseReturnEmptyString()

这会使Razor代码更加优雅和简洁。

我在谷歌上找不到任何东西 - 我甚至不确定要找什么我对Linq来说相对较新。

感谢。

2 个答案:

答案 0 :(得分:4)

您可以使用 Null Conditional ?. Null Coalesce ??

@Model.MyItems.Skip(5).FirstOrDefault()?.Title ?? "";

空条件运算符

  

用于在执行成员访问?.或索引之前测试null   ?[操作。这些运算符可帮助您编写更少的代码来处理   null检查,特别是用于降序到数据结构中。

Null Coalesce ??运营商

  

??运算符称为null-coalescing运算符。它回来了   如果操作数不为null,则为左侧操作数;否则它会返回   右手操作数。

进一步阅读

null-coalescing

更新

正如 Ron Beyer

的评论中所述
  

OP的问题还在于MyItems中可能没有5个元素,所以   Skip(5)可能返回一个空的可枚举。值得一提的是   跳过没有错误,但返回空

也就是说,列表中可能没有5个元素。虽然上面的代码可以很好地工作并愉快地返回空字符串(或者你选择的任何东西),但它并没有给你任何关于少于5个元素的指示。如果你需要知道这一点,你必须在2行中完成。

@if (Model.MyItems.Count() > 5)
{
    @Model.MyItems.Skip(5).FirstOrDefault()?.Title ?? ""
}
else
{
   // blarg there is less then 5
} 

答案 1 :(得分:2)

@Model.MyItems.Skip(5).FirstOrDefault()?.Title
在这种情况下,

FirstOrDefault()将返回null,因此在这种情况下,使用null-conditional ?.会为标题提供null。

如果你想在这种情况下为字符串添加其他内容,那么添加一个null-coalescing,例如对于空字符串:

@Model.MyItems.Skip(5).FirstOrDefault()?.Title ?? ""

或者:

@Model.MyItems.Skip(5).FirstOrDefault()?.Title ?? "Untitled"