2010-04-29 10 views
5

Devo calcolare la posizione delle intersezioni tra più intervalli di date e il numero di intersezioni sovrapposte. Quindi ho bisogno di mostrare quali intervalli di data/ora si sovrappongono a ciascuna di quelle sezioni intersecanti. È leggermente più complicato di così quindi farò del mio meglio per spiegare fornendo un esempio. Sto lavorando in VB.Net, ma gli esempi di C# sono accettabili così come lavoro in entrambi.Calcola la posizione e il numero di intersezioni tra più intervalli di data/ora?

Abbiamo diversi compiti ad alto rischio che riguardano lo stesso sistema. Di seguito ho tre lavori di esempio denominati HR1/2/3/4 con inizio/fine data/ora.

  • HR1 {1/6/2010 10:00 - 1/6/2010 15:00}
  • HR2 {1/6/2010 11:00 - 1/6/2010 18:00}
  • HR3 {1/6/2010 12:00 - 1/6/2010 14:00}
  • HR4 {1/6/2010 18:00 - 1/6/2010 20:00}

Quello che voglio sia il risultato finale è mostrato sotto. Ho difficoltà a descriverlo in qualsiasi modo, ma con l'esempio.

  • HRE1 {1/6/2010 10:00 - 1/6/2010 11:00} - Interseca 1
  • {Ora fine Split 1, per migliorare la leggibilità solo, non necessario in soluzione}
  • HRE1 {1/6/2010 11:00 - 1/6/2010 12:00} - Intersects 2
  • HRE2 {1/6/2010 11:00 - 1/6/2010 12:00} - Intersects 2
  • {End Time Split 2, solo per la leggibilità, non necessario nella soluzione}
  • HRE1 {1/6/2010 12:00 - 1/6/2010 14:00} - Intersects 3
  • HRE2 {1/6/2010 12:00 - 1/6/2010 14:00} - Intersects 3
  • HRE3 {1/6/2010 12:00 - 1/6/2010 14:00} - Intersects 3
  • {Ora fine Spalato 3, per facilitarne la lettura solo, non necessario in soluzione}
  • HRE1 {1/6/2010 14:00 - 1/6/2010 15:00} - interseca 2
  • HRE2 { 1/6/2010 14:00 - 1/6/2010 15:00} - Intersects 2
  • {End Time Split 4, solo per la leggibilità, non necessario nella soluzione}
  • HRE2 {1/6/2010 15 : 00 - 1/6/2010 18:00} - Intersects 1
  • {Ora fine Spalato 5, per facilitarne la lettura solo, non necessario in soluzione}
  • HR4 {1/6/2010 18:00 - 1/6/2010 20:00} - si interseca 1

Qualsiasi aiuto sarebbe molto apprezzato

+1

È possibile risolvere il problema per * due * intervalli di tempo? –

risposta

5
var timePoints = (from r in ranges select r.Start) 
    .Concat(from r in ranges select r.End) 
    .Distinct().OrderBy(dt => dt).ToArray(); 

var intersections = from i in Enumerable.Range(0, timePoints.Length - 1) 
        let start = timePoints[i] 
        let end = timePoints[i + 1] 
        from range in ranges 
        where range.Start <= start && range.End >= end 
        select new { Range = range, Start = start, End = end }; 

EDIT: codice modificato che conta intersezioni:

var timePoints = (from r in ranges select r.Start) 
    .Concat(from r in ranges select r.End) 
    .Distinct().OrderBy(dt => dt).ToArray(); 

var intersectionGroups = from i in Enumerable.Range(0, timePoints.Length - 1) 
         let start = timePoints[i] 
         let end = timePoints[i + 1] 
         select new 
         { 
          Start = start, 
          End = end, 
          Ranges = 
           from range in ranges 
           where range.Start <= start && range.End >= end 
           select range 
         }; 

var intersections = from intGroup in intersectionGroups 
        let count = intGroup.Ranges.Count() 
        from range in intGroup.Ranges 
        select new 
        { 
         Range = range, 
         Start = intGroup.Start, 
         End = intGroup.End, 
         Count = count 
        }; 

Non so che cosa si vuole fare con il risultato, ma può essere meglio usare intersectionGroups piuttosto che intersections .

+0

WOW!Questo è molto vicino a quello che sto cercando. All'inizio non l'ho capito ma dopo averlo attraversato in VS aveva senso dopo un minuto. Mi vengono in mente due piccole cose e una è colpa mia perché non l'ho inserita nel post originale. In primo luogo, non mi dice quanti altri intervalli si sovrappongono. Quindi per il range di tempo compreso tra le 11:00 e le 12:00 il valore sarebbe 2. Forse una proprietà aggiuntiva chiamata OverlapCount o qualcosa del genere. Secondo: Questo è il caso che non ho menzionato. Gli articoli presenti nell'array che non si sovrappongono sono eliminati. C'è un modo in cui possiamo tenerli? Ho aggiunto questo al post. – Peter

+0

Il mio codice non rilascia intervalli che non si sovrappongono a nulla (come HR4 nell'esempio). Darei un'occhiata ai conteggi. – svick

+0

svick, che il mio amico è una cosa di bellezza. In realtà avevo sviluppato una soluzione al problema prima di postare, ma era così orribile che sapevo che doveva esserci una soluzione semplice. Ancora una volta linq salva il giorno. Grazie ancora per l'assistenza svick. – Peter

Problemi correlati