我想知道如何在DateTime.MinValue
为空时在下面的代码中指定默认值ItemList
(即避免空引用异常)
List<MyFoo> list = GetList();
foreach (MyFoo foo in list.OrderBy(x =>x.ItemList.LastOrDefault().Received))
Console.WriteLine(foo);
public class MyFoo
{
public List<Item> ItemList { get; set; }
public MyFoo()
{
ItemList = new List<Item>();
}
}
public class Item
{
public DateTime Received { get; set; }
}
我知道如果Item是一个结构(即数据类型),这个代码可以正常工作,但有没有办法用引用类型产生类似的行为?
答案 0 :(得分:3)
如果?.
为空并返回ItemList
,您可以使用null-conditional null
运算符来避免空引用异常。之后,您可以使用null-coalescing运算符??
将空值替换为默认值。
如果您希望首先显示空Received
值的记录,则默认值应为DateTime.MinValue
,例如:
list.OrderBy(x =>x.ItemList.LastOrDefault()?.Received ?? DateTime.MinValue)
或DateTime.MaxValue
让它们显示在最后:
list.OrderBy(x =>x.ItemList.LastOrDefault()?.Received ?? DateTime.MaxValue)
答案 1 :(得分:2)
使用以下语法:
foreach (MyFoo foo in list.OrderBy(x =>x.ItemList.LastOrDefault()?.Received ?? DateTime.MinValue))
Console.WriteLine(foo);
如果列表为空,那么'OrderBy'运算符将使用DateTime.MinValue
值。
答案 2 :(得分:1)
如我的评论中所述,在C#6及更高版本中,您可以使用null-conditional
表达式来避免在.Received
为LastOrDefault()
时处理null
。此外,您可以将其与null-coalescing
运算符??
结合使用,以指定DateTime.MinValue
为LastOrDefault()
时的最小值null
,如下所示:
foreach (MyFoo foo in list.OrderBy(x =>x.ItemList.LastOrDefault()?.Received ?? DateTime.MinValue))
Console.WriteLine(foo);
以下是MSDN的参考资料: 空条件表达式:https://msdn.microsoft.com/en-us/library/dn986595.aspx null-coalescing operator:https://msdn.microsoft.com/en-us/library/ms173224.aspx