Il est possible de faire plusieurs agrégats avec LINQ-to-Objects, mais c'est un peu moche.
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?))
}
);
Vous auriez également besoin des fonctions Min et Max pour DateTime car elles ne sont pas disponibles en standard.
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;
}
Merci Jon. L'une des parties les plus difficiles à propos de Linq jusqu'ici est de déterminer ce que vous pouvez et ne pouvez pas faire. Je vais certainement jeter un coup d'oeil à votre technique de Push une fois que je serai un peu plus à l'aise avec la méthodologie standard. –