Используя что-то вроде:
IList date =
this.DateRanges
.SelectMany (r => новый [] {r.From, r.To})
.Distinct ()
.OrderBy (d => d)
.ToList ();
Я могу получить все даты без дублирования ни одной из них. Диапазоны могут полностью или частично перекрываться (верхнее или нижнее перекрытие), касаться друг друга или вообще не перекрываться.
Теперь мне нужно преобразовать этот список в другой, чтобы каждая последующая пара дат формировала новый сгенерированный экземпляр 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 желательно опустить.Но если его пропуск приводит к чрезмерному усложнению кода, его можно сохранить и исключить с помощью отдельной проверки. Но если это можно исключить изначально, то и нужно делать это. Поэтому, если вы также предоставляете информацию о том, как формировать пары, исключающие пустые диапазоны, вы также можете добавить эту информацию.