Estoy intentando seleccionar un subgrupo de una lista donde los elementos tienen fechas contiguas, p.Use LINQ para agrupar una secuencia por fecha sin espacios
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
estoy usando un punto de giro cada vez, así que tome el elemento de pivote como ejemplo 3, me gustaría obtener el siguiente resultado eventos contiguos alrededor del pivote:
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
Mi actual implementación es un laborioso "paseo" en el pasado, a continuación, en el futuro, para construir la lista:
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;
}
}
la lista relatedActivities
entonces debe contener los eventos contiguos, en orden.
¿Existe alguna forma mejor (quizás usando LINQ) para esto?
Tuve una idea de usar .Aggregate()
pero no pude pensar en cómo hacer que el agregado salga cuando encuentra un espacio en la secuencia.
¿Cuál es el propósito de 'preceedingEvents.TakeWhile (a => a.ID! = PreviousEvent.ID)'? La identificación parece ser siempre única en tu ejemplo. –
Esa línea simplemente toma el elemento del enumerable que está antes del elemento 'evento anterior '. Piénselo como un método '.Previous()'. – Codesleuth
Se borró un poco la muestra para incluir solo las reuniones. Pensándolo bien, podría ser mejor mostrar 'Licencia anual', pero entiendes lo esencial: – Codesleuth