Объединение последовательных дат в IList в диапазоны

  1. У меня есть серия объектов с из и Даты с по .
  2. Используя что-то вроде:

     IList  date = 
    this.DateRanges 
    .SelectMany (r => новый [] {r.From, r.To}) 
     .Distinct () 
     .OrderBy (d => d) 
     .ToList (); 
     

    Я могу получить все даты без дублирования ни одной из них. Диапазоны могут полностью или частично перекрываться (верхнее или нижнее перекрытие), касаться друг друга или вообще не перекрываться.

  3. Теперь мне нужно преобразовать этот список в другой, чтобы каждая последующая пара дат формировала новый сгенерированный экземпляр DateTime прямо в середине пары

     D1 D2 D3 D4 D5 {{1} } G1 G2 G3 G4 
     

    Где D n - мои отдельные даты из списка, а G m даты - это даты, которые я бы любят генерировать посреди них.

Вопрос

Как преобразовать упорядоченный список отдельных дат в пары, чтобы получить пары, как показано в следующем примере? Я хотел бы сформировать их, используя LINQ вместо цикла for , который может выполнять то же самое. Использование LINQ может привести к более эффективному коду из-за отложенного выполнения дерева выражений.

Дополнительное объяснение на примере из реальной жизни

Предположим, это мой пример таких диапазонов:

D1             D2     D3     D4   D5     D6          D11    D12
|--------------|      |------|    |------|           |------|
       D7                         D8
       |--------------------------|
D9                                              D10
|-----------------------------------------------|

Первый шаг получения различных дат приведет к следующим датам:

D1     D7      D2     D3     D4   D5     D6     D10  D11    D12

D9 и D8 выпадут потому что они дубликаты.

Следующим шагом будет формирование пар (я не знаю, как это сделать с помощью LINQ):

D1-D7, D7-D2, D2-D3, D3-D4, D4-D5, D5-D6, D6-D10, (D10-D11), D11-D12

Последний шаг должен вычислить дату для каждой пары, используя:

D new = D от + (D до - D от ) / 2

Проблема с пустыми диапазонами

Диапазон D 10 -D 11 желательно опустить.Но если его пропуск приводит к чрезмерному усложнению кода, его можно сохранить и исключить с помощью отдельной проверки. Но если это можно исключить изначально, то и нужно делать это. Поэтому, если вы также предоставляете информацию о том, как формировать пары, исключающие пустые диапазоны, вы также можете добавить эту информацию.

9
задан Robert Koritnik 4 October 2011 в 11:21
поделиться