LINQ OrderBy on inner object的属性

时间:2016-07-28 07:33:25

标签: linq

以下是层次结构和所需的功能

public class Friend
{
    public string Name { get; set; }
    public List<Message> Messages { get; set; }
}

public class Message
{
    public string Text { get; set; }
    public DateTime Time { get; set; }
}

现在需要的功能:

public List<string> WhatsApp(List<Friend> friends)
    {

        throw new NotImplementedException();
    }

我需要按照消息时间戳的降序获取好友姓名列表。就像Whats App或任何其他IM一样。

我感觉这可以使用LINQ在1行或2行中完成,但由于我是LINQ的新手,无法深入解决问题。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

如果想要按最后一个(即最大)消息时间戳排序,则应执行以下操作:

return friends.OrderByDescending(f => f.Messages.Max(m => (DateTime?)m.Time))
    .Select(f => f.Name)
    .ToList();

当某个朋友没有消息时,需要转换为DateTime?以避免异常。

通常,当您需要根据子属性按顺序对父有多个子项的父级进行排序时,它应该是一些聚合值(例如SumCountMin,{{ 1}}等。)。