2010-08-06 7 views
2

Possible en double:
Determine Whether Two Date Ranges OverlapSi j'ai deux périodes, comment puis-je savoir si elles se chevauchent?

Dire que j'ai deux objets, et chacun de ces objets ont une plage de dates qui se situe entre la date de fin et la date de début, comment puis-je savoir s'il y a chevauchement entre les deux plages de dates de la manière la plus efficace ou la plus rapide.

Je voudrais faire en utilisant .NET 3.5 C#

+2

essayer - http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap –

Répondre

1

Que ce soit le plus efficace ou plus rapide, je ne suis pas sûr, mais voici comment je le ferais. S'il s'est avéré être un goulot d'étranglement, alors et seulement alors je chercherais à optimiser davantage:

Vous vous assurez que la première plage commence plus tôt (ou en même temps) en permutant les plages si nécessaire. Ensuite, vous pouvez détecter un chevauchement si l'autre début de plage est inférieur ou égal à la première plage (si les plages sont incluses, contenant les heures de début et de fin) ou inférieur à (si les plages incluent le début et exclusif de fin).

En supposant compris aux deux extrémités, il n'y a que quatre possibilités dont l'un est un non-recouvrement:

|----------------------|  range 1 
|--->       range 2 overlap 
|--->       range 2 overlap 
         |---> range 2 overlap 
         |---> range 2 no overlap 

Le critère d'évaluation de la gamme 2 n'entre pas en elle. Ainsi, en pseudo-code:

def doesOverlap (r1,r2): 
    if r1.s > r2.s: 
     swap r1, r2 
    if r2.s > r1.e: 
     return false 
    return true 

Si les plages sont inclus au début et exclusif à la fin, il vous suffit de remplacer > avec >= dans la deuxième déclaration if:

|----------------------|  range 1 
|--->       range 2 overlap 
|--->       range 2 overlap 
         |---> range 2 no overlap 
         |---> range 2 no overlap 

Vous Limitez considérablement le nombre de vérifications que vous devez effectuer car vous supprimez la moitié de l'espace problème en vous assurant que la plage 1 ne démarre jamais après la plage 2.

-4

Vérifiez que le premier ou le dernier date du premier objet est en il couvre du premier objet:

bool overlap = (y.Start > x.Start && y.Start < x.End) || (y.End > x.Start && y.End < x.End);

+0

x.Start: 2001-01-01 , x.Stop: 2002-01-01, Y.Start: 1999-01-01, Y.Stop: 2001-06-01. Votre fonction renvoie false. La bonne réponse est vraie. – Slartibartfast

+1

bollocks. Merci. – Femaref

Questions connexes