Удобная работа с временными отрезками и интервалами
От: DreamWeaver ОАЭ  
Дата: 10.10.09 19:33
Оценка:
Есть большое количество различных наборов временных отрезков и интервалов и нужен богатый функционал по работе с ними. Например, определить, если ли в двух наборах отрезков пересечения, и.т.д.
Есть ли стандартные классы и встречал ли кто какие-нибудь сторонние компоненты для работы с временными отрезками и интервалами?
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
Re: Удобная работа с временными отрезками и интервалами
От: barn_czn  
Дата: 11.10.09 03:39
Оценка:
Здравствуйте, DreamWeaver, Вы писали:

DW> Есть большое количество различных наборов временных отрезков и интервалов и нужен богатый функционал по работе с ними. Например, определить, если ли в двух наборах отрезков пересечения, и.т.д.

DW> Есть ли стандартные классы и встречал ли кто какие-нибудь сторонние компоненты для работы с временными отрезками и интервалами?


Да, довольно часто встречаются задачи не только на временных отрезках но и на отрезках на числовых прямых.
Компонента не знаю, но в частности про временные отрезки — это не так трудно сделать.
Делаем структуру вроде
struct TimeSpanInterval
{
 public TimeSpan Start;
 public TimeSpan End;
}


и начинаем создавать кучу методов вроде таких:
Contains, Union, Intersect..
В общем для компонента вроде как этого мало, если не включить еще поддержку всяких расписаний. Но и таких компонент я тоже не встречал.
Re[2]: Удобная работа с временными отрезками и интервалами
От: DreamWeaver ОАЭ  
Дата: 11.10.09 11:40
Оценка: +1
Здравствуйте, barn_czn, Вы писали:

_>Здравствуйте, DreamWeaver, Вы писали:


DW>> Есть большое количество различных наборов временных отрезков и интервалов и нужен богатый функционал по работе с ними. Например, определить, если ли в двух наборах отрезков пересечения, и.т.д.

DW>> Есть ли стандартные классы и встречал ли кто какие-нибудь сторонние компоненты для работы с временными отрезками и интервалами?


_>Да, довольно часто встречаются задачи не только на временных отрезках но и на отрезках на числовых прямых.

_>Компонента не знаю, но в частности про временные отрезки — это не так трудно сделать.
_>Делаем структуру вроде
_>
_>struct TimeSpanInterval
_>{
_> public TimeSpan Start;
_> public TimeSpan End;
_>}

_>


_>и начинаем создавать кучу методов вроде таких:

_>Contains, Union, Intersect..
_>В общем для компонента вроде как этого мало, если не включить еще поддержку всяких расписаний. Но и таких компонент я тоже не встречал.

А почему используется TimeSpan, а не DateTime? Вариант написать все руками я знаю и это не сложно (просто не хочется изобретать велосипед). Но я думал делать структуру типа вашей, только с DateTime-ами.
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
Re[3]: Удобная работа с временными отрезками и интервалами
От: Sinix  
Дата: 12.10.09 02:29
Оценка:
Здравствуйте, DreamWeaver, Вы писали:

DW> А почему используется TimeSpan, а не DateTime? Вариант написать все руками я знаю и это не сложно (просто не хочется изобретать велосипед). Но я думал делать структуру типа вашей, только с DateTime-ами.


На самом деле используют либо пару DateTime-ов (start/end), либо DateTime+TimeSpan(Start/Duration). В идеале для пользователя должно быть фиолетово как оно внутри хранится.

В теории можно сделать генерик-версию диапазонов, но будут грабли с intersect/union etc.
Re[4]: Удобная работа с временными отрезками и интервалами
От: barn_czn  
Дата: 12.10.09 02:50
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, DreamWeaver, Вы писали:


DW>> А почему используется TimeSpan, а не DateTime? Вариант написать все руками я знаю и это не сложно (просто не хочется изобретать велосипед). Но я думал делать структуру типа вашей, только с DateTime-ами.


S>На самом деле используют либо пару DateTime-ов (start/end), либо DateTime+TimeSpan(Start/Duration). В идеале для пользователя должно быть фиолетово как оно внутри хранится.


На самом деле имеет право на существование оба способа. Все зависит от конкретной задачи.
Но у структуры с TimeSpan есть небольшое преимущество: TimeSpan это точка на прямой бесконечной в обе стороны (TimeSpan может быть отрицательным).
Re[5]: Удобная работа с временными отрезками и интервалами
От: Sinix  
Дата: 12.10.09 05:48
Оценка:
Здравствуйте, barn_czn, Вы писали:

_>На самом деле имеет право на существование оба способа. Все зависит от конкретной задачи.

+1
_>Но у структуры с TimeSpan есть небольшое преимущество: TimeSpan это точка на прямой бесконечной в обе стороны (TimeSpan может быть отрицательным).
Г-м-м... а оно для диапазонов надо?
Re[5]: Удобная работа с временными отрезками и интервалами
От: _FRED_ Черногория
Дата: 13.10.09 06:29
Оценка:
Здравствуйте, barn_czn, Вы писали:

_>Но у структуры с TimeSpan есть небольшое преимущество: TimeSpan это точка на прямой бесконечной в обе стороны (TimeSpan может быть отрицательным).


Если использовать две даты, то вторая (end) может быть меньше первой (begin), что будет означать то же самое.
Help will always be given at Hogwarts to those who ask for it.
Re: Удобная работа с временными отрезками и интервалами
От: _FRED_ Черногория
Дата: 13.10.09 06:32
Оценка:
Здравствуйте, DreamWeaver, Вы писали:

DW> Есть большое количество различных наборов временных отрезков и интервалов и нужен богатый функционал по работе с ними. Например, определить, если ли в двух наборах отрезков пересечения, и.т.д.


Можешь описать все необходимые операции? Например, искать пересечения интервалов или попадания значения в интервал удобнее, когда имеются две даты:

struct Interval
{
 public TimeSpan Start /* или Begin */ { get; private set; }
 public TimeSpan End { get; private set; }
}
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Удобная работа с временными отрезками и интервалами
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.10.09 10:48
Оценка: +1
Здравствуйте, Sinix, Вы писали:
S>В теории можно сделать генерик-версию диапазонов, но будут грабли с intersect/union etc.
Не, не будет. Надо только IComparable потребовать.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Удобная работа с временными отрезками и интервалами
От: _FRED_ Черногория
Дата: 19.10.09 10:55
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>>В теории можно сделать генерик-версию диапазонов, но будут грабли с intersect/union etc.

S>Не, не будет. Надо только IComparable потребовать.

Там под "генерик" понималось: хранить или "дату и дату" или "дату и длительность". В такой постановке, ИМХО, проще написать строго две структуры (с общим интерфейсом), чем пытаться обобщить.
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Удобная работа с временными отрезками и интервалами
От: Sinix  
Дата: 20.10.09 00:07
Оценка:
Здравствуйте, Sinclair!

S>Не, не будет. Надо только IComparable потребовать.


Я имел в виду порождение новых диапазонов. Там придётся передавать фабрику (порождающий каллбак) или извращаться с Activator.CreateInstance.

Подозреваю, универсальные диапазоны сами по себе будут иметь маленькую ценность — они куда важней, когда используются в наборе. А тут дизайн здорово зависит от ограничений. Допустим сцепленные диапазоны (max предыдущего = min следующего) удобно делать связанным списком. Ещё веселее — смыкающиеся диапазоны (max предыдущего = min следующего-delta) (то же самое + max считается динамически).
Re[6]: Удобная работа с временными отрезками и интервалами
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.10.09 01:02
Оценка: 10 (1) +1
Здравствуйте, Sinix, Вы писали:
S>Я имел в виду порождение новых диапазонов. Там придётся передавать фабрику (порождающий каллбак) или извращаться с Activator.CreateInstance.
Не вижу, где. Сам диапазон ничего нетривиального не умеет; его конструктор нам известен. Концы диапазона не могут появиться сами по себе — они всегда берутся из диапазонов.

S>Подозреваю, универсальные диапазоны сами по себе будут иметь маленькую ценность — они куда важней, когда используются в наборе. А тут дизайн здорово зависит от ограничений. Допустим сцепленные диапазоны (max предыдущего = min следующего) удобно делать связанным списком.

Непонятно, для чего. Если для экономии — так типичный sizeof для компонента диапазона не шибко больше (а то и вообще равен) sizeof(IntPtr).
А, к примеру, поиск отрезка, покрывающего точку X, в связанном списке делать гораздо медленнее.
S>Ещё веселее — смыкающиеся диапазоны (max предыдущего = min следующего-delta) (то же самое + max считается динамически).
Это уже, собственно, можно строить поверх обобщённых диапазонов.
Саму алгебру диапазонов построить не так уж трудно — как я уже сказал, для неё нужны только IComparable<T> от концов интервалов.
Вопрос только в том, какие операции в этой алгебре нужны
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Удобная работа с временными отрезками и интервалами
От: Sinix  
Дата: 20.10.09 01:49
Оценка: +1 :)
Здравствуйте, Sinclair, Вы писали:

S>Не вижу, где. Сам диапазон ничего нетривиального не умеет; его конструктор нам известен. Концы диапазона не могут появиться сами по себе — они всегда берутся из диапазонов.


Тьху! Стабильнейше туплю — действительно:

public Range<T> Intersect (Range<T> range)
{
  T start = Max(Min,range.Min);
  T end = Min(Max, range.Max);
  return new Range<T>(start, end);
}


Как оправдание — вторые сутки насилуют мозг задачей порождения инстансов генериков. И фиг убедишь

S>Непонятно, для чего. Если для экономии — так типичный sizeof для компонента диапазона не шибко больше (а то и вообще равен) sizeof(IntPtr).

S>А, к примеру, поиск отрезка, покрывающего точку X, в связанном списке делать гораздо медленнее.

Тупо задача "by design" имеем разбиение последовательности на сцепленные отрезки. Т.е. список в принципе не может содержать разрывы. Критичны вставки, поиск не нужен. А так да, List удобней.


S>Это уже, собственно, можно строить поверх обобщённых диапазонов.

Как и в предыдущем случае, требовалось чтобы список в принципе не мог содержать разрывов. Но да, для клиентов выглядело как список диапазонов.

S>Саму алгебру диапазонов построить не так уж трудно — как я уже сказал, для неё нужны только IComparable<T> от концов интервалов.

S>Вопрос только в том, какие операции в этой алгебре нужны

+1. Сорри за слегка бессвязные ответы, мозг спит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.