Вы можете реализовать IComparable<T>
и PricingActivity
станет сортируемым. Я думаю, если я вас правильно понимаю, вам нужно будет отсортировать по началу диапазона, а затем по приоритету. Таким образом, когда вы запрашиваете свой отсортированный список, вы получаете первое действие, диапазон которого будет начинаться и который имеет наивысший приоритет. Затем вы просто гуляете по списку до тех пор, пока не выполните одно из следующих действий: найдите действие, которое начинается после завершения последнего выбранного действия, или действие, имеющее более высокий приоритет, чем последнее выбранное. Когда у вас был весь список, вы должны были выбирать действия с наивысшим приоритетом на каждом возможном (под) интервале интервалов.
Примерно так: (не проверено)
Date selectedStart = Date.MinValue;
PricingActivity selected = sortedList[0];
foreach(PricingActivity act in sortedList)
{
if (act.Start >= selected.End ||
act.Priority > selected.Priority)
{
// Store the selected activity with the applicable date range.
selectedActivities.Add(
new DateRange(selectedStart, Math.Min(selected.End, act.Start)),
selected);
// The next activity (act) would start here.
selectedStart = act.Start;
selected = act;
}
}
selectedActivities
будет содержать упорядоченный список видов деятельности, для которых их применимые диапазоны (DateRange
только что придуман мной), как вы и хотели. Однако вам необходимо добавить некоторый код, чтобы сначала перейти к первому действию, которое находится в пределах запрошенного диапазона, и остановиться на первом действии сразу за запрошенным диапазоном.