как вы группируете список по диапазону дат - PullRequest
1 голос
/ 26 мая 2011

Я хотел бы суммировать длительности в моем Списке по DateRange по неделям или ежекварталам.

Я не уверен, что лучший подход для этого.

 List<Event> events = new List<Event>();

 class Event
 {
     public string EventName {get;set;}
     public DateTime date {get;set;}
     public double duration {get; set;}
 }

Я использую библиотеку LingBridge, которая будет разрешать лямбда-выражения в .net-2.0

Ответы [ 4 ]

1 голос
/ 26 мая 2011

Вот пример кода, совместимого с 2.0, для группировки по дате. Вы можете адаптировать его для группировки по DateTime свойству класса.

List<DateTime> dates = ...

Dictionary<int, IList<DateTime>> groupedDates 
    = new Dictionary<int, IList<DateTime>>();

foreach (DateTime date in dates)
{
     int quarter = (date.Month / 3) + 1;
     if (groupedDates.ContainsKey(quarter)) 
     {
         groupedDates[quarter].Add(date);
     }
     else  
     {
         List<DateTime> dateGroup = new List<DateTime>();
         dateGroup.Add(date);
         groupedDates.Add(quarter, dateGroup);
     }
}
1 голос
/ 26 мая 2011

Вам нужно будет перебрать свою коллекцию, используя for или foreach или аналогичный.

Для Q1, например:

List<Event> Q1Events = new List<Event>();
foreach (Event e in events)
{
    if (e.date.Month >= 1 && e.date.Month <= 3) 
        Q1Events.Add(e);
}
0 голосов
/ 26 мая 2011

На месте возвращаются все даты вместе.

event.Sort((x, y) => DateTime.Compare(x.date, y.date));
0 голосов
/ 26 мая 2011

Это сгруппировало бы его по дням года:

events.GroupBy(e => string.Format("{0}.{1}+", e.date.DayOfYear, e.date.Year);

Итак, теперь вам просто нужно выяснить свойство WeekOfYear или QuarterOfYear даты и использовать его в качестве условия группировки.

Для QuarterOfYear это может выглядеть примерно так:

events.GroupBy(e => string.Format("{0}.{1}+", (e.date.Month % 4) + 1, e.date.Year);

Но в течение недели все будет сложнее. Насколько я помню, есть разные способы начать считать недели в году. Проверьте NodaTime или другую библиотеку дат, чтобы сделать это для вас ...

...