Алгоритм поиска диапазонов времени и времени, которые перекрываются с другим списком диапазонов времени и времени

#c# #algorithm #linq #datetime #overlap

Вопрос:

У меня есть эти интервалы времени и времени

 internal class DatetimeInterval
{
    public DateTime From { get; }
    public DateTime To { get; }

    public DatetimeInterval(DateTime from, DateTime to)
    {
        From = from;
        To = to;
    }
}
 

для которых я использую для хранения старых DatetimeInterval и новых DatetimeInterval
List<DatetimeInterval>()

Учитывая набор новых DatetimeInterval букв List<List<DatetimeInterval>>() , я хотел бы для каждого набора определить набор предыдущих DatetimeInterval букв, которые перекрываются с новыми DatetimeInterval буквами.

Как мне это сделать?

Я знаю, что перекрытие можно обнаружить, сравнив два значения DatetimeIntevals, выполнив do

     if((start0A <= end0B) amp;amp; (end0A >= start0B))
    {
        Console.WriteLine("Overlap");
    }
 

но это касается только одного случая.

Есть ли какой-нибудь способ, которым я могу связать это с

     List<(List<DatetimeInterval>, List<DatetimeInterval>)> OverlappingTimeStamps = newDateTimeChunks.FindOverlapping(oldDateTimes)
 

Помимо выполнения этого в двойном цикле for и проверки каждого отдельного человека?
есть ли какой-нибудь разумный способ найти перекрывающиеся интервалы времени между двумя списками?

Моя нынешняя попытка состоит в том, чтобы сделать это вот так, но она не кажется такой эффективной..

 private static List<(IEnumerable<DatetimeInterval>, IEnumerable<DatetimeInterval>)> FindOverlappingPreviousRegistrations(
            IEnumerable<IEnumerable<DatetimeInterval>> chunkedRegistrations,
            IEnumerable<DatetimeInterval> oldRegistrations)
        {
            List<(IEnumerable<DatetimeInterval>, IEnumerable<DatetimeInterval>)> pairedOldAndNewRegistrations = new();
            foreach (IEnumerable<DatetimeInterval> chunkedRegistration in chunkedRegistrations)
            {
                IEnumerable<DatetimeInterval> overLappingRegistrations = chunkedRegistration.Where(newRegistration =>
                    oldRegistrations.Any(oldRegistration =>
                        newRegistration.From <= oldRegistration.To amp;amp; oldRegistration.To >= newRegistration.From));
                pairedOldAndNewRegistrations.Add((overLappingRegistrations, chunkedRegistration));
            }

            return pairedOldAndNewRegistrations;
        }
    
 

Комментарии:

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

2. Я не забыл о вас, но мой ответ по какой-то причине кажется неправильным (или, по крайней мере, хотя компаратор работает нормально, я по какой-то причине не могу заставить его работать с linq’s intersect). Вы можете увидеть, что я попробовал здесь: rextester.com/VCL36242