Es posible hacer múltiples agregados con LINQ a objetos, pero es un poco feo.
var times = punches.Aggregate(
new { EarliestIn = default(DateTime?), LatestOut = default(DateTime?) },
(agg, p) => new {
EarliestIn = Min(
agg.EarliestIn,
p.type == "In" ? (DateTime?)p.PunchTime : default(DateTime?)),
LatestOut = Max(
agg.LatestOut,
p.type == "Out" ? (DateTime?)p.PunchTime : default(DateTime?))
}
);
También habría que las funciones mínimas y máximas para DateTime ya que estos no son estándar disponible.
public static DateTime? Max(DateTime? d1, DateTime? d2)
{
if (!d1.HasValue)
return d2;
if (!d2.HasValue)
return d1;
return d1.Value > d2.Value ? d1 : d2;
}
public static DateTime? Min(DateTime? d1, DateTime? d2)
{
if (!d1.HasValue)
return d2;
if (!d2.HasValue)
return d1;
return d1.Value < d2.Value ? d1 : d2;
}
Gracias Jon. Una de las partes más difíciles de Linq hasta ahora es descubrir qué puedes y qué no puedes hacer. Definitivamente echaré un vistazo a tu técnica de Push una vez que me sienta un poco más cómodo con la metodología estándar. –