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.
Ich würde so etwas versuchen:
%Vor% Wenn Sie sich nicht überlappen, filtern Sie einfach die überlappenden Ereignisse von Ihrem EventList
mit Except
:
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%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.
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.
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:
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%