Запрос LINQ для извлечения данных из списка

#c# #linq

#c# #linq

Вопрос:

У меня есть коллекция списков объектов сообщений.

 public class Message
{
    public int Id { get; set; }
    public string Body { get; set; }
    public string Sender { get; set; }
    public DateTime Timestamp { get; set; }
}
 

Я хочу получить только одно сообщение с самой последней меткой времени для каждого отправителя. Как мне это сделать с помощью LINQ?

Комментарии:

1. Вы уже что-нибудь пробовали? Кроме того, как содержатся эти сообщения?

Ответ №1:

Вам нужно сгруппировать по Sender , а затем получить максимальную временную метку из каждой группы, например:

 var query = list.GroupBy(r => r.Sender)
                .Select(grp => new
                {
                    Sender = grp.Key,
                    RecentTimeStamp = grp.Max(r => r.Timestamp)
                });
 

Или вы можете отсортировать временную метку в группе по убыванию и получить первый элемент, например:

 var query = list.GroupBy(r => r.Sender)
                .Select(grp => new
                {
                    Sender = grp.Key,
                    RecentTimeStamp = grp.OrderByDescending(r => r.Timestamp).FirstOrDefault()
                });
 

Ответ №2:

 var q = from n in table
        group n by n.Senderinto g
        select g.OrderByDescending(t=>t.Timestamp).FirstOrDefault();
 

Комментарии:

1. почему OrderBy, а не Max<TSource>(IEnumerable<TSource>, Func<TSource, Double>)