using System.Collections.Generic;
public static void Main()
var hr = new HealthRecord();
public interface IReportHealthMeasures<T>
DateTime DateReported { get; }
public class Observation<T>: IReportHealthMeasures<T>
public Observation(Guid reportedBy, DateTime dateReported, T measurement)
DateReported = dateReported;
Measurement = measurement;
public Guid ReportedBy { get; private set; }
public DateTime DateReported { get; private set; }
public T Measurement { get; private set; }
public interface IMeasure
DateTime DateMeasured { get; }
public interface IMeasureVitalSigns: IMeasure
double Measurement { get; }
public abstract class VitalSignMeasurementBase: IMeasureVitalSigns
protected VitalSignMeasurementBase(Guid measuredBy, DateTime dateMeasured, double aMeasurement)
DateMeasured = dateMeasured;
Measurement = aMeasurement;
public Guid MeasuredBy { get; private set; }
public DateTime DateMeasured { get; private set; }
public double Measurement { get; private set; }
public class DiastolicReading: VitalSignMeasurementBase
public DiastolicReading(Guid measuredBy, DateTime dateMeasured, double aMeasurement):base(measuredBy, dateMeasured, aMeasurement)
public class SistolicReading: VitalSignMeasurementBase
public SistolicReading(Guid measuredBy, DateTime dateMeasured, double aMeasurement):base(measuredBy, dateMeasured, aMeasurement)
public class HealthRecord
DiastolicHistory = new List<Observation<DiastolicReading>>();
for(var i = 0; i < 2; i++)
var dr = new DiastolicReading(Guid.NewGuid(), DateTime.Now, 120);
var o = new Observation<DiastolicReading>(Guid.NewGuid(), DateTime.Now, dr);
SistolicHistory = new List<Observation<SistolicReading>>();
for(var i = 0; i < 2; i++)
var sr = new SistolicReading(Guid.NewGuid(), DateTime.Now, 80);
var o = new Observation<SistolicReading>(Guid.NewGuid(), DateTime.Now, sr);
public List<Observation<DiastolicReading>> DiastolicHistory { get; private set; }
public List<Observation<SistolicReading>> SistolicHistory { get; private set; }
public void PrintLatestDate()
var history = DiastolicHistory.Select(o => new { DateReported = o.DateReported, ReportedBy = o.ReportedBy }).ToList();
history.AddRange(SistolicHistory.Select(o => new { DateReported = o.DateReported, ReportedBy = o.ReportedBy }));
Console.WriteLine("Below is the collection of anonymous types that we have accrued:");
history.ForEach(h => Console.WriteLine("\tID = " + h.ReportedBy + " | Date = " + h.DateReported));
Console.WriteLine("\nBelow is the latest date in that collection:");
Console.WriteLine(history.Max(h => h.DateReported));