2016-07-28 33 views
1

下面是层次结构和所需的功能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一样。

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

在此先感谢您的帮助。

+0

那么你到目前为止尝试过什么?您希望从哪些信息中获取时间戳,因为您可以使用其中的很多或不使用它们?你有没有阅读任何LINQ教程? –

+0

我已经通过OrderBy函数,但只要遍历到Messages.Time,Friend.Name值就会丢失。所以,我没有得到Friend.Name的列表。对不起,如果我没有准确解释它。我需要按照消息时间的降序获取好友名单。最近发送消息的朋友(说A)先发送消息,然后发送消息之前发送消息的那个... – user2861226

+0

所以,你实际上是通过消息中的* latest *消息来订购朋友的?你可能想要弄清楚如何得到“最新消息的日期/时间”(提示:最大),然后按顺序排列。但你也应该考虑没有发过消息的朋友。 –

回答

3

如果这个想法是最后一个(即最大)消息时间戳命令,下面应该做的工作:

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

铸造到DateTime?是需要避免的异常时,有一些朋友没有消息。

通常,当您需要订购具有基于儿童的属性的东西多子女的父或母,应该是一些总价值(如SumCountMinMax等)。

+0

谢谢伊万,这是按预期工作。但是,我不明白为什么Max会像排序一样。为什么它将消息列表排序。它应该给最大时间戳的消息。这意味着Max应该给单个对象。如果可能的话,请在此点亮一下。 – user2861226

+0

是的,Max从每个朋友的相关消息中返回单个值。然后,按照该值对朋友进行排序。想象一下,朋友有一个叫做LastMessageTime的属性,你可以对它进行排序。 –