I have following class structure and I need to find the most recent UpdatedDate
for Order
i.e. Max of Order / Orderline / OrderlineSize / OrderlineVAS
. The lists are never null but might be empty.
class Order
{
public List<Orderline> Orderlines { get; set; }
public DateTime UpdatedDate { get; set; }
}
class Orderline
{
public List<OrderlineSize> OrderLineSizes { get; set; }
public List<OrderlineVAS> OrderLineValueAddedServices { get; set; }
public DateTime UpdatedDate { get; set; }
}
class OrderlineSize
{
public DateTime UpdatedDate { get; set; }
}
class OrderlineVAS
{
public DateTime UpdatedDate { get; set; }
}
I am using the following code to get Max
which works fine if there are some OrderLineSizes
but throws a NullReferenceException
when list is empty.
(new List<DateTime?>() {
order.UpdatedDate,
order.Orderlines.Max(x=>x.UpdatedDate),
order.Orderlines.SelectMany(x=>x.OrderLineSizes).DefaultIfEmpty()?.Max(y=>y.UpdatedDate),
order.Orderlines.SelectMany(x=>x.OrderLineValueAddedServices).DefaultIfEmpty()?.Max(y=>y.UpdatedDate)
})
.Max().Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
I have solved it using elvis operation from C# 6 as below
(new List<DateTime?>() {
order.UpdatedDate,
order.Orderlines.Max(x=>x?.UpdatedDate),
order.Orderlines.SelectMany(x=>x.OrderLineSizes).Max(y=>y?.UpdatedDate),
order.Orderlines.SelectMany(x=>x.OrderLineValueAddedServices).Max(y=>y?.UpdatedDate)
})
.Max().Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
How could it be solved using earlier versions of C#
? I reckon the use of Select
clause in Linq but not sure if that is a good option.
How can I optimize it for better performance?