内部对象上的LINQ OrderBy';s属性

内部对象上的LINQ OrderBy';s属性,linq,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; } } 公共类好友 { 公共字符串名称{ge

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

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; }
}
公共类好友
{
公共字符串名称{get;set;}
公共列表消息{get;set;}
}
公共类消息
{
公共字符串文本{get;set;}
公共日期时间{get;set;}
}
现在,所需的功能:

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

        throw new NotImplementedException();
    }
public List WhatsApp(列出朋友)
{
抛出新的NotImplementedException();
}
我需要得到的朋友名单的名字降序有消息时间戳。就像Whats应用程序或其他IM一样

我有一种感觉,使用LINQ可以在1或2行中完成这项工作,但由于我是LINQ新手,无法深入研究这个问题


提前感谢您的帮助。

如果您想按最后一个(即最大)消息时间戳下单,请执行以下操作:

return friends.OrderByDescending(f => f.Messages.Max(m => (DateTime?)m.Time))
    .Select(f => f.Name)
    .ToList();
需要强制转换为
DateTime?
,以避免在没有朋友消息时出现异常


一般来说,当您需要根据子属性对具有多个子项的父项进行排序时,它应该是一些聚合值(例如
Sum
Count
Min
Max
等)。

到目前为止您尝试了什么?考虑到可能有多条消息或没有消息,您希望从哪条消息获取时间戳?你们读过LINQ教程了吗?我已经读过OrderBy函数,但只要我遍历到Messages.Time,Friend.Name值就丢失了。所以,我没有得到朋友的名单。对不起,如果我没有准确解释的话。我需要按消息时间的降序获得朋友姓名列表。最近发送消息的朋友(比如A)排在第一位,然后是在A之前发送消息的朋友…那么你实际上是在根据消息中的最新消息来排序朋友?您可能想了解如何获取“最新消息的日期/时间”(提示:Max)并据此进行排序。但是你也应该考虑没有发送任何信息的朋友。假设输入列表中的所有朋友都发送了一个或只有一条消息。我们怎么能一直走到留言时间。如果我使用“friends.OrderByDescending(x=>x.Message.Time)”,编译器将不允许我编写“Message.Time”。当然不,因为没有
Message
属性,是吗?您需要
x.Messages[0]。时间
或类似信息。如果您想从每个朋友只有一条消息的简单场景开始,您可能希望以这种方式对其进行建模,使用
公共消息{get;set;}
属性而不是
消息
属性。谢谢Ivan,这正如预期的那样工作。然而,我不明白为什么Max的行为像排序。为什么要对邮件列表进行排序。它应该给出带有最大时间戳的消息。这意味着Max应该给出一个对象。如果可能的话,请解释一下。是的,Max从每个朋友的相关消息中返回一个值。然后按该值对朋友进行排序。假设朋友有一个名为
LastMessageTime
的属性,您可以根据它进行排序。