Sto provando a selezionare un sottogruppo di un elenco in cui gli articoli contengano date contigue, ad es.Utilizzare LINQ per raggruppare una sequenza per data senza spazi vuoti
ID StaffID Title ActivityDate -- ------- ----------------- ------------ 1 41 Meeting with John 03/06/2010 2 41 Meeting with John 08/06/2010 3 41 Meeting Continues 09/06/2010 4 41 Meeting Continues 10/06/2010 5 41 Meeting with Kay 14/06/2010 6 41 Meeting Continues 15/06/2010
sto usando un punto di rotazione di volta in volta, in modo da prendere l'elemento esempio pivot come 3, mi piacerebbe ottenere la seguente risultante eventi contigui in tutto il pivot:
ID StaffID Title ActivityDate -- ------- ----------------- ------------ 2 41 Meeting with John 08/06/2010 3 41 Meeting Continues 09/06/2010 4 41 Meeting Continues 10/06/2010
Il mio attuale implementazione è una laboriosa "passeggiata" in passato, poi verso il futuro, per creare l'elenco:
var activity = // item number 3: Meeting Continues (09/06/2010)
var orderedEvents = activities.OrderBy(a => a.ActivityDate).ToArray();
// Walk into the past until a gap is found
var preceedingEvents = orderedEvents.TakeWhile(a => a.ID != activity.ID);
DateTime dayBefore;
var previousEvent = activity;
while (previousEvent != null)
{
dayBefore = previousEvent.ActivityDate.AddDays(-1).Date;
previousEvent = preceedingEvents.TakeWhile(a => a.ID != previousEvent.ID).LastOrDefault();
if (previousEvent != null)
{
if (previousEvent.ActivityDate.Date == dayBefore)
relatedActivities.Insert(0, previousEvent);
else
previousEvent = null;
}
}
// Walk into the future until a gap is found
var followingEvents = orderedEvents.SkipWhile(a => a.ID != activity.ID);
DateTime dayAfter;
var nextEvent = activity;
while (nextEvent != null)
{
dayAfter = nextEvent.ActivityDate.AddDays(1).Date;
nextEvent = followingEvents.SkipWhile(a => a.ID != nextEvent.ID).Skip(1).FirstOrDefault();
if (nextEvent != null)
{
if (nextEvent.ActivityDate.Date == dayAfter)
relatedActivities.Add(nextEvent);
else
nextEvent = null;
}
}
l'elenco relatedActivities
dovrebbe quindi contenere gli eventi contigui, in ordine.
C'è un modo migliore (forse utilizzando LINQ) per questo?
Ho avuto l'idea di usare .Aggregate()
ma non potrebbe pensare come raggiungere l'aggregato di uscire quando trova un gap nella sequenza.
Qual è lo scopo di 'preceedingEvents.TakeWhile (a => a.ID! = PreviousEvent.ID)'? L'ID sembra essere sempre unico nel tuo esempio. –
Questa riga prende semplicemente l'oggetto dall'enumerabile che precede l'elemento 'previousEvent'. Pensalo come un metodo '.Precedente()'. – Codesleuth
Completato l'esempio per includere solo le riunioni. A pensarci bene, potrebbe essere meglio mostrare "Congedo annuale", ma mi viene l'idea che spero: s – Codesleuth