Uh sorry, rileggendo ho visto che avevo capito male il problema, la faccenda è un po' più complicata di come pensavo.
Comunque, procederei in questa maniera: usa un Dictionary<int, decimal> per memorizzare i totali per ogni anno, quindi, per ogni riga esaminata:
- se inizio e fine appartengono allo stesso anno, è facile: fai la differenza delle due date (con DateTime.Subtract); ottieni un valore TimeSpan. Dal numero di mesi di differenza ricavi il totale relativo all'unico anno considerato; aggiungi il valore ottenuto all'elemento del dictionary corrispondente all'anno; altrimenti:
- per prima cosa considera l'anno della data di partenza; genera un nuovo oggetto Date relativo all'1 gennaio dell'anno successivo, fai anche qui la differenza e moltiplica il prezzo per il numero di mesi; aggiungi il valore ottenuto come sopra;
- per ogni anno "intermedio" aggiungi al relativo elemento nel dictionary 12*valore mensile;
- per l'ultimo anno, anche qui fai una differenza rispetto all'1 gennaio dell'anno in questione, calcola i mesi e aggiungi come sopra.