Строка
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();