Finde überlappende Zeiträume (Ereignisse) mit LINQ

8

Ich habe eine Liste von Ereignissen und möchte jetzt herausfinden, welche Ereignisse sich überschneiden. Im Folgenden finden Sie den Code, den ich derzeit habe, aber ich habe das Problem, dass der Gegenstand, nach dem gesucht wird, auch in der Liste enthalten ist.

%Vor%

Ich müsste eine neue Liste ohne das gesuchte Objekt erstellen. Daher frage ich, ob es einen schönen LINQ-Ausdruck gibt, der das für mich handhaben kann. Dies ist ein Pseudo-Code, an den ich gedacht habe:

%Vor%

In diesem Kontext existiert eventItem natürlich nicht.

Als Ergebnis würde ich zwei Listen benötigen: eine mit überlappenden Ereignissen und eine mit nicht überlappenden Ereignissen. Aber das sollte mit .Except() möglich sein, wenn ich meine überlappende Ereignisliste habe.

Bearbeiten:

Ich habe eine dotnetfiddle erstellt, damit man damit spielen kann. Eine wichtige Frage ist der überlappende Algorithmus.

Ereignis 1:
StartDate: heute, 10:00
EndDate: heute, 10:05

Ereignis 2:
StartDate: heute, 10:05
EndDate: heute, 10:10

Wenn Sie dies dem Benutzer präsentieren, ist dies NICHT überlappend. Also muss ich meinen Algorithmus überarbeiten.

    
testing 26.05.2015, 13:15
quelle

4 Antworten

2

Ich würde so etwas versuchen:

%Vor%

Wenn Sie sich nicht überlappen, filtern Sie einfach die überlappenden Ereignisse von Ihrem EventList mit Except :

%Vor%

Ich kenne Ihre SomeEventObject nicht, aber Sie müssen möglicherweise den Ungleichheitsvergleich um einige Id Vergleich ändern.

Es gibt ein ziemlich gutes Q & A zum Erkennen überlappender Zeiträume in C # , das Sie untersuchen möchten. Sie können die Prüfung auch wie folgt ausschließen:

%Vor%     
jnovo 26.05.2015 13:25
quelle
2

Ich würde es so machen:

%Vor%

Ich denke, das sollte ziemlich geradlinig sein.

Laut dem Kommentar gibt diese Version nur einmal ein Element EventList zurück, unabhängig davon, an wie vielen Überlappungen sie beteiligt ist.

%Vor%

Es kann auch geschrieben werden als:

%Vor%

Basierend auf dem weiteren Kommentar, können Sie die Ereignisse folgendermaßen koppeln:

%Vor%

Jetzt overlappingEvents ist eine Liste von Arrays - List<SomeEventObject[]> und nicht List<SomeEventObject> . Das Array enthält die überlappenden Ereignisse.

    
Enigmativity 27.05.2015 09:29
quelle
1

Sie können das Ergebnis damit erhalten:

%Vor%

Aber ich verstehe Ihren überlappenden Algorithmus nicht. Ich denke, Überlappung bedeutet, dass StartDate eines Ereignisses zwischen StartDate und EndDate eines anderen Ereignisses liegt:

%Vor%     
Alex Sikilinda 26.05.2015 13:25
quelle
1

Ich weiß, dass du gesagt hast, dass du Linq benutzen willst und es ist sicherlich einigermaßen geradlinig. Wir haben das gemacht - aber wir arbeiten viel mit Datumsangaben und haben einen viel besseren Weg gefunden.

Wenn Sie viel von dieser Zeit der Arbeit tun, würde ich die Itenso Zeit empfehlen Zeitraumbibliothek (verfügbar auf Nuget ).

Es bietet Unterstützung für eine Vielzahl von zeitbasierten Operationen. Wie IsSamePeriod, HasInside, OverlapsWith oder IntersectsWith sind für Periodenbeziehungen verfügbar.

Es unterstützt auch Zeitsammlungen, z.B. Alle Ereignisse für eine Person. Diese basieren auf ITimePeriodCollection kann beliebige Elemente vom Typ ITimePeriod enthalten und interpretiert den frühesten Start aller Elemente als Beginn des Erfassungszeitraums. Entsprechend gilt das letzte Ende aller Elemente als Ende der Sammlungsperiode.

Ein Codebeispiel für einen Geschmack, wie es funktioniert

%Vor%     
GraemeMiller 27.05.2015 09:00
quelle

Tags und Links