У меня есть метод, который получает целый ряд объектов этого классаКакой хороший, общий алгоритм для свертывания набора потенциально перекрывающихся диапазонов?
class Range<T>
{
public T Start;
public T End;
}
В моем случае T
является DateTime
, но позволяет использовать int
для простоты. Мне нужен метод, который сворачивает эти диапазоны в те, которые покрывают одну и ту же «область», но не перекрываются.
Так что если я имел следующие диапазоны
- 1 до 5
- 3 до 9
- 11 до 15
- 12 до 14
- 13 до 20
Метод должен дать мне
- 1 до 9
- 11 до 20
Угадайте она будет называться объединением? Я полагаю, метод подписи может выглядеть следующим образом:
public static IEnumerable<Range<T>> Collapse<T>(
this IEnumerable<Range<T>>,
IComparable<T> comparer)
{
...
}
Я смотрел на некоторые другие вопросы здесь, которые отчасти похожи, но я не нашел реализацию этого еще. This answer и некоторые другие ответы на один и тот же вопрос описывают алгоритмы, но я не совсем уверен, понимаю ли я алгоритмы. Не особенно хорошо при реализации алгоритмов, так что я надеялся, что кто-то здесь может помочь мне.
+1, я люблю хорошую перестрелку алгоритма! – grenade
Определенно +1. То, что выходит из этого, было бы здорово иметь в наборе инструментов! – Moose
много раз спрашивали ... – nlucaroni