Определение перекрытия дат в списке дат - PullRequest
0 голосов
/ 16 марта 2020

У меня есть список элементов, каждый из которых имеет начало и конец компонент времени и даты.

var myDates= new List<Tuple<DateTime, DateTime>>();

, которые я заполняю его определенной датой.

Теперь я хотел бы пройти через них oop и посмотреть, есть ли у двух из них какая-либо перекрывающаяся дата. Итак, я сделал это:

var myOverlapList = (from start in myDates
                   from endDate in myDates
                   where !Equals(start, end)
                   where start.Item1 <= end.Item2 && start.Item2 >= end.Item1
                   select end);

Это работает , когда даты перекрываются, например, один день назад и вперед между двумя датами, НО НЕ работает, когда две даты записи имеют значения EXACT SAME .
Так, как я могу исправить свой код или просто что-то еще для достижения этого.

1 Ответ

2 голосов
/ 17 марта 2020

Строка

where !Equals(startDate, endDate)

, которая должна отфильтровать тот же кортеж даты, фактически отфильтровывает любые дубликаты, поэтому любой совпадающий временной интервал выпадает из выбора. Таким образом, ваш запрос вернет все DateTime кортежи, которые перекрываются с некоторыми другими кортежами в коллекции, но только уникальными. И вы также хотите вернуть кортежи, если они встречаются в вашей коллекции более одного раза. На самом деле ваша проблема заключается в том, что вы не можете различить два разных элемента с одинаковым значением. Таким образом, вам нужен дискриминатор для них, и, поскольку вы используете список, индекс элемента хорошо подходит. Вы можете преобразовать свою коллекцию Tuple<DateTime, DateTime>, например, {int id, Tuple<DateTime, DateTime> range} объект с помощью

var datesWithId = dates.Select((d, i) => new {id = i, range = d});

, а затем изменить свой запрос следующим образом:

var anyOverlap = (from startDate in datesWithId
                  from endDate in datesWithId
                  where startDate.id!=endDate.id
                  && startDate.range.Item1 <= endDate.range.Item2
                  && startDate.range.Item2 >= endDate.range.Item1
                  select endDate.range).Distinct();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...