2016-05-28 4 views
3

Рассмотрим простой классВыбор последняя запись каждого дня

public class Data 
{ 
    public DateTime Date; 
    public object Content; 
} 

Теперь у меня есть IEnumerable<Data> под названием datas и я хочу Linq сортировать старые элементы каждого день. Так что, если есть предметы того же дня, меня интересует только последний пункт того дня.

Возможно ли это с Linq?

ответ

4

Вот как вы можете это сделать:

var result = 
    datas 
    //Group by day (we don't include time here) 
    .GroupBy(x => x.Date.Date) 
    //For each group (day), get most recent item (we include time here) 
    .Select(g => g.OrderByDescending(x => x.Date).First()) 
    .ToList(); 

Для получения дополнительной читаемости, вы также можете использовать x.TimeOfDay вместо x.Date в Select заявлении.

+0

Спасибо. Это похоже на работу! – Matthias

+0

Еще один вопрос: возможно ли использовать синтаксис «sql» для написания этого мира кода? ala: 'var result = from data in datas .... select data' – Matthias

+0

Я действительно не использую sql-синтаксис. Поэтому я не уверен, что вы можете перевести все в этот синтаксис. Я не уверен, что это можно сделать лучше, чем это: 'из данных в данных группы данных по data.Date.Date в g select g.OrderByDescending (x => x.Date.TimeOfDay) .First()' –

2

Используйте это:

var result = from x in datas 
     group x by x.Date.Date into g 
     select g.OrderByDescending(x => x.Date).FirstOrDefault(); 

Или

var result = datas.GroupBy(x => x.Date.Date) 
      .Select(g => g.Where(x => x.Date == g.Max(y => y.Date)) 
      .First()); 
+0

Тип '' '' 'Data', а не' DateTime'. –

+0

Вам нужно выбрать 'Date' из' x', а затем вызвать 'Max'. –

+0

@YacoubMassad Вы имеете в виду 'x.Date.Max()'? –

Смежные вопросы