我在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来说相对较新。
感谢。
答案 0 :(得分:4)
您可以使用 Null Conditional ?.
Null Coalesce ??
@Model.MyItems.Skip(5).FirstOrDefault()?.Title ?? "";
空条件运算符
用于在执行成员访问
?.
或索引之前测试null?[
操作。这些运算符可帮助您编写更少的代码来处理 null检查,特别是用于降序到数据结构中。
Null Coalesce ??运营商
??
运算符称为null-coalescing运算符。它回来了 如果操作数不为null,则为左侧操作数;否则它会返回 右手操作数。
进一步阅读
正如 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"
等