Я бы сгруппировал грузы с той же логикой, что и вы, но вместо этого использовал эту перегрузку из GroupBy
, что позволило мне проецировать каждую группу грузов в другой тип.Этот тип будет здесь перечислимой последовательностью групп грузов, каждый элемент в которой представляет грузы, которые не только находились в одной и той же группе с самого начала, но также должны доставляться в течение часа.Таким образом, подпись resultSelector
будет
Func<anontype, IEnumerable<Consignment>, IEnumerable<IEnumerable<Consignment>>>
. На этом этапе становится ясно, что, вероятно, было бы неплохо определить тип для группировки, чтобы можно было избавиться от анонимного типа ввышеуказанная подпись;в противном случае вы будете вынуждены определить свой resultSelector
как лямбду.
В пределах resultSelector
вам необходимо сначала отсортировать входящую группу грузов по DeliverFrom
, а затем вернуть подгруппы на основев это времяТак что это может выглядеть так:
IEnumerable<IEnumerable<Consignment>>
Partitioner(ConsignmentGroupKey key, IEnumerable<Consignment> cg)
{
cg = cg.OrderBy(c => c.DeliverFrom);
var startTime = cg.First().DeliverFrom;
var subgroup = new List<Consignment>();
foreach(var cons in cg) {
if ((cons.DeliverFrom - startTime).TotalMinutes < 60) {
subgroup.Add(cons);
}
else {
yield return subgroup;
startTime = cons.DeliverFrom;
subgroup = new List<Consignment>() { cons };
}
}
if (subgroup.Count > 0) {
yield return subgroup;
}
}
Я не пробовал это, но, насколько я могу судить, это должно работать.