2014-02-09 4 views
1

Я хочу сгруппировать данные по месяцам (пример: январь 2014, февраль 2014). Это не проблема, но теперь у меня есть иногда более одной записи каждого дня, поэтому мне приходится группировать данные еще раз по дате.Публикация статей по месяцам и по дате

Вот пример:

var lst = [{02/01/2014, 5}, {02/01/2014, 6}, {02/01/2014, 3}, {01/01/2014, 5}, {01/02/2014, 5}] 

==> группы по месяцу (февраль, январь)

[{02/01/2014, 5}, {02/01/2014, 6}, {02/01/2014, 3}], [{01/01/2014, 5}, {01/02/2014, 5}] 

==> группы в день (1 февраля, 1 января, 2 . января)

[{02/01/2014, 4,67}], [{01/01/2014, 5}], [{01/02/2014, 5}]

Вот код для моего KeyedL IST:

public class KeyedList<TKey, TItem> : List<TItem> 
{ 
    public TKey Key { protected set; get; } 
    public IEnumerable<TItem> Items { protected set; get; } 

    public KeyedList(TKey key, IEnumerable<TItem> items) : base(items) 
    { 
     Key = key; 
     Items = items; 
    } 

    public KeyedList(IGrouping<TKey, TItem> grouping) 
     : base(grouping) 
    { 
     Key = grouping.Key; 
     Items = grouping; 
    } 
} 

Для меня можно сгруппировать значения по месяцам:

var groupedItems = from item in MyItems 
        orderby Convert.ToDateTime(item.Date) descending, 
        group item by Convert.ToDateTime(item.Date).ToString("MMMM) into items 
        select new KeyedList<string, MyDataType>(items); 

Но как я могу сделать вторую группировку в группу дни. Благодарю.

+0

Ну, но мне нужны две группы. Одна группировка по месяцам и другая группировка по дням. Если я использую непосредственно элемент '' 'group item by item.Date в элементы' '', чем у меня есть только одна группировка. – atticus3000

+1

В вашем примере не хватает дат, чтобы понять, что вы имеете в виду. Если вы хотите собрать свои результаты в «KeyedList», одной группы должно быть достаточно (только по дням?). –

+0

Ну. Я хочу использовать первую группу по месяцам. У меня есть LongListSelector с заголовком и JumpList Style для перехода между месяцами. В этом месяце я хочу объединить записи с одного дня с одной записью. Таким образом, вторая группа группировалась по группам по месяцам. – atticus3000

ответ

0

Я не знаю, как вы хотите организовать свои результаты (если это KeyedList начинают играть роль), но это должно в основном делать то, что вы хотите:

from item in MyItems 
group item by new { item.Date.Year, item.Date.Month } into monthGroup 
select new { monthGroup.Key, 
      Days = from d in monthGroups 
        group d by d.Date.Day into dayGroup 
        select new { d.Key, dayGroup } 
      } 

Я использую item.Date, при условии, что вы будете иметь возможность сначала создавать список объектов с разобранными датами, вместо того, чтобы намного менее эффективный множественный разбор в самом запросе.

Кстати, обратите внимание, что ваш KeyedList почти такой же, как у IGrouping. Может быть, обойтись можно.

+0

Я могу использовать ваш код, но у меня есть последний вопрос. Если я хочу использовать ItemTemplate в моем LongListSelector, и у меня есть поле MyText в моем классе MyItems. Как я могу использовать DataBinding для отображения MyText? – atticus3000

+0

В компоненте пользовательского интерфейса должно быть что-то вроде DisplayValue или DisplayMember. Но если вы не можете понять это, лучше спросите новый вопрос с соответствующими деталями, например, тип UI (WPF?) И точную форму ваших данных. –

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