避免LastOrDefault中的空值

时间:2017-01-17 15:53:34

标签: c#

我想知道如何在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是一个结构(即数据类型),这个代码可以正常工作,但有没有办法用引用类型产生类似的行为?

3 个答案:

答案 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值。

请参阅:?? Operator?. Operator

答案 2 :(得分:1)

如我的评论中所述,在C#6及更高版本中,您可以使用null-conditional表达式来避免在.ReceivedLastOrDefault()时处理null。此外,您可以将其与null-coalescing运算符??结合使用,以指定DateTime.MinValueLastOrDefault()时的最小值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