Veloce confronto programmatico dei dati "orario"

3

Considera i dati degli orari dei treni, in cui ogni servizio (o "corsa") ha una struttura dati come tale:

public class TimeTable
{
    public int Id {get;set;}
    public List<Run> Runs {get;set;}
}

public class Run 
{
    public List<Stop> Stops {get;set;}
    public int RunId {get;set;}
}

public class Stop 
{
    public int StationId {get;set;}
    public TimeSpan? StopTime {get;set;}
    public bool IsStop {get;set;}
}

Abbiamo un elenco di esecuzioni che operano su una particolare linea (la classe TimeTable ).

Inoltre, mentre abbiamo una raccolta di stazioni fisse su una linea, non tutte le corse si fermano su tutte le stazioni (ovvero IsStop sarebbe false e StopTime sarebbe null ).

Ora, immagina di aver ricevuto il calendario iniziale, lo abbiamo elaborato e caricato nella struttura dati sopra. Una volta completato il caricamento iniziale, viene mantenuto in un database: la struttura dei dati viene utilizzata solo per caricare l'orario dalla sua origine e per mantenerlo nel database.

Ora stiamo ricevendo un orario aggiornato.

L'orario aggiornato può o non può avere alcuna modifica - non sappiamo e non viene detto se sono presenti modifiche.

Quello che vorrei fare è eseguire un confronto per ogni corsa in modo efficiente. Non voglio semplicemente sostituire ogni corsa. Invece, voglio avere un'attività in background che viene eseguita periodicamente che scarica il dataset aggiornato dell'orario e poi la confronta con il calendario corrente. Se vengono rilevate differenze, alcune azioni (non pertinenti alla domanda) avranno luogo.

Inizialmente pensavo a una sorta di processo di checksum, in cui potevo, ad esempio, caricare entrambe le esecuzioni (ovvero, dal nuovo orario ricevuto e quello che è stato mantenuto nel database) nella struttura dati e quindi somma tutti i componenti delle ore di StopTime e tutti i componenti dei minuti di StopTime e confronta i risultati (cioè sia la somma di Ore che la somma dei Minuti sarebbe la stessa, e le differenze introdotte se si fermano il tempo è cambiato, un arresto cancellato o un nuovo stop aggiunto).

Sarebbe un modo valido per verificare le differenze o esiste un modo migliore per affrontare questo problema? Posso vedere un problema che, ad esempio, uno stop viene modificato per essere 2 minuti prima, e un altro modificato per essere 2 minuti più tardi avrebbe una variazione netta zero.

O sto pensando troppo a questo, e sarebbe più semplice controllare tutte le fermate per assicurarsi che

  1. La corsa aggiornata si ferma sulle stesse stazioni; e
  2. Ogni fermata è allo stesso tempo
posta Brendan Green 18.09.2012 - 02:38
fonte

1 risposta

1

am I over thinking this, and would it just be simpler to brute check all stops...

Penso che tu stia pensando troppo a questo. Un controllo sarebbe comunque eseguito molto velocemente. Anche se c'è un modo migliore, trascorrerai così tanto tempo per un beneficio insignificante per l'utente finale. Ciò è particolarmente vero se il processo di confronto viene eseguito su un ciclo batch.

Potresti anche scrivere le informazioni in un file sequenziale (avrai bisogno di una nuova struttura) quindi creare un valore hash basato su tutti i valori, ma questo è un po 'complesso e devi scegliere un algoritmo di hashing che genera chiavi univoche.

In alternativa, è possibile utilizzare la stessa struttura lineare ed eseguire un'utilità di confronto per contrassegnare le differenze (se presenti). Se non viene rilevata alcuna differenza, non caricare la nuova pianificazione, altrimenti, eseguire l'aggiornamento utilizzando i delta.

Non penso che ci sarebbe un modo semplice per confrontare i 2 set senza forza bruta.

Cerca sempre di mantenerlo semplice;)

    
risposta data 18.09.2012 - 04:53
fonte

Leggi altre domande sui tag